답변:
상호 상관과 컨볼 루션은 밀접한 관련이 있습니다. 간단히 말해 FFT와의 컨볼 루션 을 수행 하려면
conv(a, b) = ifft(fft(a_and_zeros) * fft(b_and_zeros))
FFT 방법은 실제로 원형 교차 상관 이기 때문에 제로 패딩을 수행해야합니다 . 즉, 신호가 끝에서 줄 바꿈됩니다. 따라서 오버랩을 없애고 무한대까지 0 인 신호를 시뮬레이션하기에 충분한 0을 추가합니다.
컨벌루션 대신 상호 상관 을 얻으려면 FFT를 수행하기 전에 신호 중 하나를 시간 역전하거나 FFT 이후에 신호 중 하나의 복합 공액을 사용해야합니다.
corr(a, b) = ifft(fft(a_and_zeros) * fft(b_and_zeros[reversed]))
corr(a, b) = ifft(fft(a_and_zeros) * conj(fft(b_and_zeros)))
하드웨어 / 소프트웨어가 더 쉬운 방법입니다. 자기 상관 (신호 자체와의 상호 상관)의 경우 복잡한 공액을 수행하는 것이 좋습니다. FFT를 한 번만 계산하면되기 때문입니다.
신호가 실제 인 경우 실제 FFT (RFFT / IRFFT)를 사용하고 스펙트럼의 절반 만 계산하여 계산 시간의 절반을 절약 할 수 있습니다.
또한 FFT가 최적화 된 더 큰 크기 ( FFTPACK의 경우 5 스무스 숫자, FFTW의 경우 ~ 13 스무스 숫자 또는 간단한 하드웨어 구현의 경우 2의 거듭 제곱) 로 패딩하여 계산 시간을 절약 할 수 있습니다 .
다음은 무차별 상관 관계와 비교 한 FFT 상관 관계의 Python 예제입니다. https://stackoverflow.com/a/1768140/125507
이렇게하면 상호 상관 함수가 제공되며, 이는 유사성 대 오프셋의 척도입니다. 파도가 서로 "정렬"되는 오프셋을 얻으려면 상관 함수에 피크가 있습니다.
피크의 x 값은 오프셋이며 음수이거나 양수일 수 있습니다.
나는 이것이 두 파도 사이의 오프셋을 찾는 데 사용되는 것을 보았습니다. 피크에서 포물선 / 이차 보간법 을 사용하면 오프셋을보다 정확하게 추정 할 수 있습니다 (샘플의 해상도보다 낫습니다) .
-1과 1 사이의 유사성 값 (다른 신호가 증가함에 따라 신호 중 하나가 감소 함을 나타내는 음수 값)을 얻으려면 입력 길이, FFT 길이, 특정 FFT 구현에 따라 진폭을 스케일링해야합니다. 스케일링 등. 웨이브 자체와의 자기 상관은 가능한 최대 일치 값을 제공합니다.
이것은 같은 모양의 파도에서만 작동합니다. 다른 하드웨어에서 샘플링되었거나 노이즈가 추가되었지만 모양이 같은 경우이 비교는 효과가 있지만, 필터링이나 위상 변이에 의해 파형이 변경되면 소리가 같을 수 있습니다. 상관 없습니다.
상관 관계 는 두 시계열 (이 경우 오디오 샘플)의 유사성을 한 숫자로 표현하는 방법입니다. 공분산 의 적응은 다음과 같이 구현됩니다.
period = 1/sampleFrequency;
covariance=0;
for (iSample = 0; iSample<nSamples; iSample++)
covariance += (timeSeries_1(iSample)*timeSeries_2(iSample))/period;
//Dividing by `period` might not even be necessary
상관은 정규화 된 공분산 버전이며, 공분산은 시계열 두 표준 편차의 곱으로 나눈 값입니다. 상관 관계가없는 경우 (전체적으로 유사하지 않은 경우) 0과 전체 상관 관계에 대한 1 (전체적으로 유사한 경우)이됩니다.
두 개의 사운드 샘플이 비슷하지만 동기화되지 않았다고 상상할 수 있습니다. 여기에서 상호 상관 이 발생합니다. 하나의 샘플만큼 이동 한 시계열 간의 상관 관계를 계산합니다.
for (iShift=0; iShift<nSamples; iShift++)
xcorr(iShift) = corr(timeSeries_1, timeSeries_2_shifted_one_sample);
그런 다음 corr
시리즈 의 최대 값을 찾으십시오 . (또는 충분한 상관 관계를 찾으면 중단하십시오) 물론 약간 더 있습니다. 표준 편차를 구현하고 일부 메모리 관리를 수행하고 시간 이동을 구현해야합니다. 모든 오디오 샘플의 길이가 동일하면 공분산을 정규화하지 않고 교차 공분산을 계산할 수 있습니다.
이전 질문 과의 멋진 관계 : 푸리에 분석은 교차 공분산의 적응입니다. 한 시계열을 이동하고 다른 신호와의 공분산을 계산하는 대신 한 신호와 주파수가 다른 여러 (공) 사인파 간의 공분산을 계산합니다. 그것은 모두 같은 원칙에 기초합니다.
신호 처리에서 교차 상관 (MATLAB의 xcorr)은 두 시퀀스 중 하나가 반전 된 컨볼 루션 연산입니다. 시간 반전은 주파수 영역에서 복잡한 컨쥬 게이션에 해당하므로 DFT를 사용하여 다음과 같이 상호 상관을 계산할 수 있습니다.
R_xy = ifft(fft(x,N) * conj(fft(y,N)))
여기서 N = size (x) + size (y)-1 (바람직하게는 2의 거듭 제곱으로 반올림)은 DFT의 길이입니다.
DFT의 곱셈은 시간의 원형 컨벌루션 과 같습니다 . 두 벡터를 길이 N으로 제로 패딩하면 y의 원형으로 이동 한 구성 요소가 x와 겹치지 않게되어 결과가 x의 선형 컨벌루션 y와 동일하게됩니다.
1의 지연은 y의 오른쪽 원형 이동이고 -1의 지연은 왼쪽 원형 이동입니다. 상호 상관은 단순히 모든 지연에 대한 일련의 내적입니다. 표준 fft 순서에 따라 다음과 같이 액세스 할 수있는 배열이됩니다. 0에서 size (x) -1까지의 인덱스는 양의 지연입니다. 지수 N- 크기 (y) +1 내지 N-1은 역의 음의 지연이다. (Python에서 음의 지연은 R_xy [-1]과 같은 음의 인덱스로 편리하게 액세스 할 수 있습니다.)
0으로 채워진 x와 y를 N 차원 벡터로 생각할 수 있습니다. 주어진 지연에 대한 x와 y의 내적은 |x|*|y|*cos(theta)
입니다. x와 y의 규범은 원형 이동에 대해 일정하므로, 그것들을 나누면 각도 세타의 다양한 코사인을 남깁니다. 만약 주어진 공간에 대한 x와 y가 N 공간에서 직교라면, 상관은 0이다 (즉, 세타 = 90도). 공선 형인 경우 값은 1 (양의 상관 관계) 또는 -1 (음의 상관 관계, 즉 세타 = 180도)입니다. 이로 인해 상호 상관이 단일화로 정규화됩니다.
R_xy = ifft(fft(x,N) * conj(fft(y,N))) / (norm(x) * norm(y))
이것은 단지 겹치는 부분에 대한 표준을 다시 계산하여 편견을 만들 수 없지만 시간 영역에서 전체 계산을 수행 할 수도 있습니다. 또한 다른 버전의 정규화가 표시됩니다. 단일화로 정규화되는 대신, 교차 상관은 M (편향)으로 정규화됩니다. 여기서 M = max (size (x), size (y)) 또는 M- | m | (m 번째 지연의 편견없는 추정치).
최대 통계적 유의성을 위해 상관 관계를 계산하기 전에 평균 (DC 바이어스)을 제거해야합니다. 이를 교차 공분산 (MATLAB의 xcov)이라고합니다.
x2 = x - mean(x)
y2 = y - mean(y)
phi_xy = ifft(fft(x2,N) * conj(fft(y2,N))) / (norm(x2) * norm(y2))
2*size (a) + size(b) - 1
또는 이어야한다는 것을 의미합니까 2*size (b) + size (a) - 1
? 그러나 두 경우 모두 두 패딩 배열의 크기가 다릅니다. 패딩이 너무 많으면 어떤 결과가 발생합니까?
b
함께 a
교대 당 하나 개의 출력, 하나 개의 샘플의 최소 중복으로. 그것은 size(a)
긍정적 인 지연과 size(b) - 1
부정적인 지연을 만들어냅니다. N- 포인트 DFT 곱의 역변환을 사용하면 0
통과 size(a)-1
하는 인덱스 는 양의 지연이고, N-size(b)+1
통과 N-1
하는 인덱스 는 음의 지연입니다.
Matlab을 사용하는 경우 교차 상관 함수를 시도하십시오.
c= xcorr(x,y)
xcorr
랜덤 프로세스의 상호 상관 시퀀스를 추정합니다. 자기 상관은 특별한 경우로 처리됩니다....
c = xcorr(x,y)
는 길이 2 * N-1 벡터에서 상호 상관 시퀀스를 반환하며, 여기서x
andy
는 길이N
벡터N > 1
입니다. 경우x
와y
같은 길이 아닌, 짧은 벡터는 더 이상 벡터의 길이 제로 패딩입니다.상관 관계 http://www.mathworks.com/help/toolbox/signal/ref/eqn1263487323.gif
차이를 찾는 가장 쉬운 방법은 시간 영역에서 두 개의 오디오 신호를 빼는 것입니다. 동일하면 모든 시점의 결과는 0이됩니다. 동일하지 않으면 빼기 후에 차이가 남으므로 직접들을 수 있습니다. 이들이 얼마나 유사한 지에 대한 빠른 측정은이 차이의 RMS 값일 것입니다. 예를 들어 MP3와 WAV 파일의 차이를 듣기 위해 오디오 믹싱 및 마스터 링에서 종종 수행됩니다. (한 신호의 위상을 반전하고 추가하는 것은 빼기와 같습니다. 이것이 DAW 소프트웨어에서 수행 될 때 사용되는 방법입니다.) 이것이 작동하려면 완벽하게 시간 정렬되어야합니다. 그렇지 않은 경우 상위 10 개의 피크 감지, 피크의 평균 오프셋 계산 및 하나의 신호 이동과 같은 알고리즘을 개발할 수 있습니다.
주파수 영역으로 변환하고 제안한대로 신호의 전력 스펙트럼을 비교하면 시간 영역 정보가 무시됩니다. 예를 들어, 반대로 재생되는 오디오는 앞으로 재생할 때 동일한 스펙트럼을 갖습니다. 따라서 두 개의 매우 다른 오디오 신호가 정확히 동일한 스펙트럼을 가질 수 있습니다.