자기 상관의 개념은 주어진 지연에서 신호와 그 자체의 유사성을 측정하는 것입니다. 여러 가지 방법으로 접근 할 수 있지만 피치 / 템포 감지를 위해 검색 절차로 생각할 수 있습니다. 다시 말해, 샘플별로 신호를 단계별로 살펴보고 참조 창과 지연된 창 사이의 상관 관계를 수행합니다. "lag 0"에서의 상관 관계는 참조 자체를 그대로 사용하기 때문에 전체 최대 값이됩니다. 앞으로 나아갈수록 상관 관계는 반드시 감소하지만 주기적 신호의 경우 어느 시점에서 다시 증가하기 시작한 다음 로컬 최대 값에 도달합니다. "lag 0"과 첫 번째 피크 사이의 거리는 피치 / 템포의 추정치를 제공합니다. 내가하는 방식
샘플 별 상관 관계 계산은 높은 샘플링 속도에서 계산 비용이 많이 들기 때문에 일반적으로 FFT 기반 접근 방식이 사용됩니다. 관심있는 세그먼트의 FFT를 복소 공액으로 곱한 다음 역 FFT를 취하면 주기적 자기 상관을 얻을 수 있습니다 . 코드에서 ( numpy 사용 ) :
freqs = numpy.fft.rfft(signal)
autocorr = numpy.fft.irfft(freqs * numpy.conj(freqs))
효과는 주기적 구성 요소 (정의에 의해 자체와 유사 함)에 비해 신호 자체의 노이즈 량 (자체와 무관)을 감소시키는 것입니다. 역변환을 수행하기 전에 자기 상관 (즉, 켤레 곱셈)을 반복하면 노이즈가 훨씬 줄어 듭니다. 백색 잡음과 혼합 된 사인파의 예를 고려하십시오. 다음 그림은 440hz 사인파, 노이즈로 인해 동일한 사인파, 노이즈 파의 순환 자기 상관 및 이중 순환 자기 상관을 보여줍니다.
두 자기 상관 신호의 첫 번째 피크가 원래 신호의 첫 번째 사이클 끝에 정확히 어떻게 위치하는지 유의하십시오. 주기성 (이 경우 피치)을 결정하기 위해 찾고있는 피크입니다. 첫 번째 자기 상관 신호는 여전히 "흔들림"이므로 피크 검출을 위해서는 어떤 종류의 평활화가 필요합니다. 주파수 영역에서 두 번의 자동 상관 관계는 동일한 것을 달성하며 비교적 빠릅니다. "wiggly"는 플롯 중심에서 발생하는 딥이 아니라 확대 할 때 신호가 어떻게 보이는지를 의미합니다. 순환 자동 상관의 후반은 항상 전반부의 거울상이 될 것이므로 "딥"의 종류가 일반적입니다. 알고리즘을 명확히하기 위해 코드는 다음과 같습니다.
freqs = numpy.fft.rfft(signal)
auto1 = freqs * numpy.conj(freqs)
auto2 = auto1 * numpy.conj(auto1)
result = numpy.fft.irfft(auto2)
둘 이상의 자기 상관을 수행해야하는지 여부는 신호에 얼마나 많은 노이즈가 있는지에 따라 다릅니다.
물론,이 아이디어에는 많은 미묘한 변형이 있으며 여기서는 그 모든 것을 다루지는 않겠습니다. (피치 감지와 관련하여) 내가 본 가장 포괄적 인 범위는 Rabiner와 Schafer 의 음성 신호 디지털 처리에 있습니다.
이제 자기 상관이 템포 감지에 충분한 지 여부에 관한 것입니다. 대답은 '예'입니다. 소스 신호에 따라 템포 정보를 얻을 수 있지만 모든 경우에 의미가 무엇인지 이해하기 어려울 수 있습니다. 예를 들어, 다음은 브레이크 비트의 두 루프에 대한 플롯과 전체 시퀀스의 순환 자기 상관 플롯입니다.
참고로 다음은 해당 오디오입니다.
확실히, 루프 포인트에 해당하는 중간에 멋진 스파이크가 있지만 꽤 긴 세그먼트를 처리 한 것입니다. 게다가, 그것이 정확한 사본이 아니었다면 (예를 들어 장비가 있다면) 그 스파이크는 깨끗하지 않을 것입니다. 자기 상관은 템포 감지에 유용 할 것이지만 복잡한 소스 재료로는 그 자체로는 충분하지 않을 것입니다. 예를 들어, 급상승을 찾더라도 전체 측정 값인지 1/4 음표인지, 반 음표인지 또는 다른지 어떻게 알 수 있습니까? 이 경우 전체 척도 인 것이 확실하지만 항상 그런 것은 아닙니다. 내부 동작이 명확해질 때까지 더 간단한 신호에서 AC를 사용하여 놀아보고 일반적으로 템포 감지에 대한 또 다른 질문을합니다 ( "더 큰"