오디오 분석에서의 자기 상관


11

Autocorrelation 에 대해 읽고 있지만 그것이 어떻게 작동하고 어떤 출력을 기대해야하는지 정확하게 이해하지 못했습니다. 신호를 AC 기능에 입력하고 슬라이딩 윈도우 입력을해야한다고 생각하고 있습니다. 각 창 (예를 들어, 1024 개의 샘플)은 -1과 1 사이의 계수를 출력합니다. 부호는 단순히 선이 위 또는 아래인지 여부를 나타내며 값은 상관 관계가 얼마나 강한지를 나타냅니다. 간단히하기 위해 겹치지 않고 매번 창 1024 샘플을 이동한다고 가정 해 봅시다. 44100의 표본에서 43 개의 계수를 얻을 수 있으며 모든 계수를 유지해야합니까?

이것을 200 초 신호에 대해 수행하면 8600 계수가 나타납니다. 반복과 템포를 감지하기 위해이 계수를 어떻게 사용합니까? 그것들을 그룹화하기 위해 일종의 신경망을 만들어야합니까, 아니면 과잉입니까?

도움을 주셔서 감사합니다.


4
샘플이 x [ 1 ] , x [ 2 ] , , x [ 1024 ] 라고 가정합니다 . AC 기능이 무엇을 반환하는지 알려 주시겠습니까? 가능한 대답은 다음과 같습니다. "그것은 1024 i = 1 ( x [ i ] ) 2를 반환합니다."또는 " 1024 를 반환 합니다. R [ k ] 여기서 R [ k ] = 1024 k1024엑스[1],엑스[2],,엑스[1024]나는=11024(엑스[나는])21024아르 자형[케이]"또는"1024숫자R[k]를반환합니다.여기서R[k]= 1024 k i = 1 x[i]x[i+k]+ k i = 1 x[1024k+i]x아르 자형[케이]=나는=11024케이엑스[나는]엑스[나는+케이]1024아르 자형[케이] ". 세 가지 제안 된 답변 모두 자기 상관 개념과 호환됩니다.아르 자형[케이]=나는=11024케이엑스[나는]엑스[나는+케이]+나는=1케이엑스[1024케이+나는]엑스[나는]
Dilip Sarwate

Dilip, 도와 주셔서 감사합니다. 저는 아직 AC 기능을 구현하지 않았습니다. 이론을 먼저 이해하려고 노력하고 있습니다. 첫 번째 방정식이 가장 쉬운 것처럼 보이지만 사전에 데이터를 정규화해야합니까?
XSL

1
예를 들면 다음과 같습니다. gist.github.com/255291#L62
endolith

답변:


23

자기 상관의 개념은 주어진 지연에서 신호와 그 자체의 유사성을 측정하는 것입니다. 여러 가지 방법으로 접근 할 수 있지만 피치 / 템포 감지를 위해 검색 절차로 생각할 수 있습니다. 다시 말해, 샘플별로 신호를 단계별로 살펴보고 참조 창과 지연된 창 사이의 상관 관계를 수행합니다. "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를 사용하여 놀아보고 일반적으로 템포 감지에 대한 또 다른 질문을합니다 ( "더 큰"


2
잠깐, 오디오 신호 자체의 자기 상관입니까? 디지털 루프 이외의 템포 감지에는 그다지 유용하지 않습니다. 일부 RMS 엔벨로프의 자기 상관은 일반적으로 여러 주파수 대역에 대해 별도로 작동하는 것이 훨씬 낫습니다.
leftaroundabout

1
음악이 어떤 종류의 비트를 가지고있는 한, 시간 방향으로 STFT의 자기 상관은 꽤 잘 작동합니다 . 이것은 본질적으로 많은 주파수 대역의 자기 상관을 실행 한 다음 서로 합산하는 것과 같습니다.
endolith

2
@leftroundabout 오른쪽, 자기 상관 그 자체 외에 템포 감지 (사전, 사후 처리)를 위해해야 ​​할 일이 많이 있습니다. 나는 주로 OP의 질문에 대한 첫 번째 문장에 응답하고 있는데 (즉, "자기 상관 법은 어떻게 작동 하는가") 다른 프로세스가 관여 할 것이기 때문에 템포 감지에 대해 또 다른 질문을 제안합니다.
datageist

@endolith 여기서 무슨 뜻 Autocorrelation of the STFT in the time direction입니까? 구체적으로 시간 방향 부분
popctrl

1
@popctrl STFT의 각 행의 자기 상관을 계산하는 의미
endolith

3

자동 상관을 사용하여 비트 감지를 수행하려는 것처럼 들립니다. 이 작업을 수행 할 수 있지만 오디오를 크게 다운 샘플링하는 것이 좋습니다. 1 ~ 3Hz (60bpm ~ 180bpm) 사이의 신호를 찾고 있으므로 44100Hz 분해능이 필요하지 않습니다. 적절하게 계산되고 정규화 된 자기 상관은 지연 0에서 1.0입니다 (신호는 자체적으로 완벽하게 상관됩니다). 주기적 신호의 경우 ac가 0 아래로 떨어지고 기본 주파수에 해당하는 래그에서 피크로 되돌아 가고 고조파에서 피크가 더 작아집니다. 이 피크를 검색 할 적절한 범위를 선택해야합니다. 잡음의 경우, 자기 상관은 떨어지고 기본적으로 0에서 약한 구불 구불 한 선이 나타납니다. 일반적으로 정규화 된 ac에서 피크가 0.5보다 크면 주기적 신호가 나타납니다.


1

자동 상관 관계는 단순히 신호 자체와의 상호 상관 관계입니다. 이를 쉽게 계산할 수있는 방법은 원래 신호와 시간 반전 된 신호 버전간에 컨벌루션을 수행하는 것입니다. 1000 샘플 길이의 신호가있는 경우 자동 상관 관계보다 1999 (2 * N-1)의 0이 아닌 샘플이 있습니다. (실제 신호에 대한) 자동 상관 관계는 항상 시간적으로 대칭 적이므로 즉, 이들 샘플 중 1000 개만이 유일합니다 (즉, ac [n] = ac [-n]).

연속 신호는 유한 세그먼트로 분류되어야합니다. 이는 푸리에 변환과 유사합니다. 기술적으로 -inf에서 + inf로 통합해야하지만이를 필요에 따라 겹침 및 / 또는 창으로 분할하여 유용한 결과를 얻을 수도 있습니다. 창 길이, 모양 및 오버랩의 선택은 응용 프로그램에 따라 다릅니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.