두 개의 오디오 파일이 유사하다는 것을 증명하기 위해 상호 상관을 어떻게 구현합니까?


58

두 오디오 파일의 상호 상관 관계가 서로 비슷하다는 것을 증명해야합니다. 두 오디오 파일의 FFT를 가져 와서 별도의 어레이에서 전력 스펙트럼 값을 갖습니다.

이들을 상호 상관시키고 유사하다는 것을 어떻게 증명해야합니까? 더 좋은 방법이 있습니까? 기본 아이디어는 배우고 적용하는 데 도움이 될 것입니다.


두 개의 랜덤 신호 벡터의 상호 상관이 주어집니다. MATLAB에서 두 벡터를 얻기 위해 역을 어떻게 구현합니까? John Muhehe

답변:


56

상호 상관과 컨볼 루션은 밀접한 관련이 있습니다. 간단히 말해 FFT와의 컨볼 루션 을 수행 하려면

  1. 입력 신호를 제로 패드하십시오 (파의 절반 이상이 "공백"이되도록 끝에 0을 추가하십시오)
  2. 두 신호의 FFT를 취하십시오
  3. 결과에 곱하기 (요소 별 곱셈)
  4. 역 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 구현에 따라 진폭을 스케일링해야합니다. 스케일링 등. 웨이브 자체와의 자기 상관은 가능한 최대 일치 값을 제공합니다.

이것은 같은 모양의 파도에서만 작동합니다. 다른 하드웨어에서 샘플링되었거나 노이즈가 추가되었지만 모양이 같은 경우이 비교는 효과가 있지만, 필터링이나 위상 변이에 의해 파형이 변경되면 소리가 같을 수 있습니다. 상관 없습니다.


3
제로 패딩은 N = size (a) + size (b) -1 이상이어야하며, 바람직하게는 2의 거듭 제곱으로 반올림되어야합니다. -1과 1 사이의 값을 얻으려면 norm (a) * norm (b 주어진 지연에 대해 N- 공간에서 두 벡터 사이의 각도의 코사인을 제공한다 (즉, 원형 시프트 모듈로 N). 극단적 인 지연에는 겹치는 샘플이 많지 않기 때문에 (먼 극단에 하나만 있음) norm (a) * norm (b)으로 나누면 이러한 상관 관계가 0으로 편향됩니다 (즉, N 공간에서 상대 직교성을 나타냄) .
Eryk Sun

1
설명에 오류가 있다고 생각합니다. FFT에 항을 곱 하면 교차 상관 의 FFT가 아니라 신호 컨볼 루션 의 FFT를 제공 해서는 안 됩니까? 내가 이해하는 바와 같이, 교차 상관의 FFT를 얻으려면 iFFT를 사용하기 전에 항 곱셈에서 FFT 벡터 중 하나의 복소 공액 을 사용해야합니다 .
Dilip Sarwate

@DilipSarwate : 그렇습니다. 시간 방향으로 하나의 신호를 반전시킬 수도 있습니다.
endolith

1
"왜 하드웨어에서 시간 반전이 어려운가요?" 대부분의 경우 계산은 로컬 , 즉 번째 셀에 저장된 가 가장 가까운 이웃 와만 상호 작용할 것으로 예상하여 데이터가 수축기 배열에 저장됩니다 . 전송 번 셀에 및 전송 셀 번호로 및 모든 이렇게 배선 비용, 배선 지연의 증가도 (따라서하면 달성 가능한 최대 클록 레이트를 감소), 모든 때문에 와이어가 서로 교차해야하므로 라우팅 문제가 발생합니다. 가능한 경우는 피해야한다,이 경우, 그것은 이다 피할.x[i]ix[±i]x[i](Ni)x[Ni]ii
Dilip Sarwate

1
@Leo 요소 별 곱셈. nx1 배열 x nx1 배열 = nx1 배열 대답에서이 "샘플 단위"라고했습니다.
endolith

17

상관 관계 는 두 시계열 (이 경우 오디오 샘플)의 유사성을 한 숫자로 표현하는 방법입니다. 공분산 의 적응은 다음과 같이 구현됩니다.

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시리즈 의 최대 값을 찾으십시오 . (또는 충분한 상관 관계를 찾으면 중단하십시오) 물론 약간 더 있습니다. 표준 편차를 구현하고 일부 메모리 관리를 수행하고 시간 이동을 구현해야합니다. 모든 오디오 샘플의 길이가 동일하면 공분산을 정규화하지 않고 교차 공분산을 계산할 수 있습니다.

이전 질문 과의 멋진 관계 : 푸리에 분석은 교차 공분산의 적응입니다. 한 시계열을 이동하고 다른 신호와의 공분산을 계산하는 대신 한 신호와 주파수가 다른 여러 (공) 사인파 간의 공분산을 계산합니다. 그것은 모두 같은 원칙에 기초합니다.


1
0은 상관 관계가없고 1은 전체 상관 관계라고 언급했습니다. 나는 -1이 완전히 음의 상관 관계에 있다는 것을 알고 싶습니다. -1은 샘플 1이 샘플 2와 반대임을 나타냅니다. X, Y 그래프에서 생각하면 양의 기울기가있는 선과 음의 기울기가있는 선입니다. 그리고 0에 가까워지면 선이 "더 희미 해집니다".
Kellenjb

@kellenjb, 그렇습니다. 그러나 아마도 여러분이 관심을 가질만한 상관 관계의 정도라고 말하면됩니다. 1 또는 -1은 신호가 서로 직접적으로 영향을 미칩니다.
Kortuk

13

신호 처리에서 교차 상관 (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? 그러나 두 경우 모두 두 패딩 배열의 크기가 다릅니다. 패딩이 너무 많으면 어떤 결과가 발생합니까?

@RobertK 교차 상관 배열은 eryksun이 그의 답변에서 말한 것처럼 적어도 a와 b의 길이의 합계 (마이너스 1) 여야합니다. 간단히하기 위해, 길이는 종종 더 긴 벡터 길이의 두 배가됩니다 (때로는 효율적인 FFT를 사용하기 위해 다음으로 큰 거듭 제곱으로 반올림 됨 ). 이 선택은 고객이 더 긴 벡터의 자기 상관을 원한다고 결정한 때 도움이됩니다. 0이 너무 많은 패딩의 한 가지 결과는 추가 계산이지만 더 효율적인 FFT 구현으로 개선 될 수 있습니다. 2
Dilip Sarwate

@RobertKJ : 당신은 슬라이딩하고 b함께 a교대 당 하나 개의 출력, 하나 개의 샘플의 최소 중복으로. 그것은 size(a)긍정적 인 지연과 size(b) - 1부정적인 지연을 만들어냅니다. N- 포인트 DFT 곱의 역변환을 사용하면 0통과 size(a)-1하는 인덱스 는 양의 지연이고, N-size(b)+1통과 N-1하는 인덱스 는 음의 지연입니다.
Eryk Sun

3

Matlab을 사용하는 경우 교차 상관 함수를 시도하십시오.

c= xcorr(x,y)

Matlab 설명서는 다음과 같습니다.

xcorr랜덤 프로세스의 상호 상관 시퀀스를 추정합니다. 자기 상관은 특별한 경우로 처리됩니다.

...

c = xcorr(x,y)는 길이 2 * N-1 벡터에서 상호 상관 시퀀스를 반환하며, 여기서 xand y는 길이 N벡터 N > 1입니다. 경우 xy같은 길이 아닌, 짧은 벡터는 더 이상 벡터의 길이 제로 패딩입니다.

상관 관계 http://www.mathworks.com/help/toolbox/signal/ref/eqn1263487323.gif


연결이 끊어진 것 같습니다.
Danijel

2

오디오 파일을 빠르고 간단하게 비교할 수 있습니다. 오디오 파일을 가져 와서 복사하고, daw로 복사하고, 2 개의 스테레오 채널에 나란히 붙여넣고, 스테레오 트랙 중 하나에서 위상을 반전시키고, 줌 모드에서 처음에 두 파일을 정렬하십시오. 처음에 두 파일의 진폭이 모두 같고 재생합니다. 총 침묵이 있으면 차이가있는 경우 두 파일 모두 동일합니다.


1

여기에서 가장 많이 쓴 것처럼 상관 관계를 사용해야합니다.

다음 두 가지 요소 만 고려하십시오.

  1. 볼륨이 다르게 스케일링되면 상관 관계를 정규화해야합니다.
  2. 시간 스케일링이있는 경우 동적 시간 왜곡을 사용할 수 있습니다.

0

차이를 찾는 가장 쉬운 방법은 시간 영역에서 두 개의 오디오 신호를 빼는 것입니다. 동일하면 모든 시점의 결과는 0이됩니다. 동일하지 않으면 빼기 후에 차이가 남으므로 직접들을 수 있습니다. 이들이 얼마나 유사한 지에 대한 빠른 측정은이 차이의 RMS 값일 것입니다. 예를 들어 MP3와 WAV 파일의 차이를 듣기 위해 오디오 믹싱 및 마스터 링에서 종종 수행됩니다. (한 신호의 위상을 반전하고 추가하는 것은 빼기와 같습니다. 이것이 DAW 소프트웨어에서 수행 될 때 사용되는 방법입니다.) 이것이 작동하려면 완벽하게 시간 정렬되어야합니다. 그렇지 않은 경우 상위 10 개의 피크 감지, 피크의 평균 오프셋 계산 및 하나의 신호 이동과 같은 알고리즘을 개발할 수 있습니다.

주파수 영역으로 변환하고 제안한대로 신호의 전력 스펙트럼을 비교하면 시간 영역 정보가 무시됩니다. 예를 들어, 반대로 재생되는 오디오는 앞으로 재생할 때 동일한 스펙트럼을 갖습니다. 따라서 두 개의 매우 다른 오디오 신호가 정확히 동일한 스펙트럼을 가질 수 있습니다.

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