본문 바로가기
Linguistic Intelligence/Audio Processing

자기 상관 관계 및 공분산

by goatlab 2024. 4. 24.
728x90
반응형
SMALL

자기 상관 관계 및 공분산

 

음성 신호 세그먼트는 큰 규모에서 구조를 식별하기 어렵지만 작은 규모에서는 신호가 연속적으로 보인다. 음성 신호는 일반적으로 서로 시간적으로 가까운 샘플링이 진폭이 유사한 구조를 갖는다. 이러한 구조를 종종 단기 시간 구조라고 합니다. 보다 구체적으로, 신호 샘플은 이전 및 다음 샘플과 상관된다. 이러한 구조는 공분산 (covariance)과 상관 관계 (correlation)로 측정된 통계에 있으며, 평균이 0인 변수 x와 y에 대해 다음과 같이 정의된다.

 

import numpy as np
import matplotlib.pyplot as plt
from scipy.io import wavfile
import scipy

# read from storage
filename = 'sample.wav'
fs, data = wavfile.read(filename)

window_length_ms = 20
window_length = int(np.round(fs*window_length_ms/1000))

n = np.linspace(0.5,window_length-0.5,num=window_length)

#windowpos = np.random.randint(int((len(data)-window_length)))
windowpos = 92274

datawin = data[windowpos:(windowpos+window_length)]
datawin = datawin/np.max(np.abs(datawin)) # normalize

plt.plot(n*1000/fs,datawin)
plt.xlabel('Time (ms)')
plt.ylabel('Amplitude')
plt.title('A window of a signal')
plt.tight_layout()
plt.show()

 

음성 신호의 경우 시간 인덱스와 상관 관계를 측정한다. 관심 영역은 서로 가까이 있을 때 나타나므로 상관 관계를 측정하는 것이 더 좋다. 스칼라는 지연 (lag)으로 알려져 있다. 또한, 세그먼트 내의 모든 부분에 걸쳐 상관 관계가 균일하다고 가정할 수 있다. 이에 해당하는 자기 상관 (autocorrelation) 및 자기 공분산 (autocovariance)은 다음과 같이 정의된다.

 

 

단시간 상관 관계가 보존된다는 것을 확인할 수 있다. 작은 규모에서는 자기 공분산이 원래 음성 신호와 유사해 보인다. 진동하는 구조도 정확하게 보존되어 있다. 신호가 고정되어 있다고 가정하고 위 공식의 결과로 자기 공분산과 상관 관계가 대칭 (symmetric)임을 알 수 있다. 이 대칭성은 곡선이 지연 0을 중심으로 대칭되는 그림에서 명확하게 볼 수 있다.

 

import numpy as np
import matplotlib.pyplot as plt
from scipy.io import wavfile
import scipy
import scipy.fft

# read from storage
filename = 'sample.wav'
fs, data = wavfile.read(filename)

window_length_ms = 20
window_length = int(np.round(fs*window_length_ms/1000))

n = np.linspace(0.5,window_length-0.5,num=window_length)
n2 = np.linspace(1-window_length,window_length-1,num=window_length*2)

# windowing function
windowing_fn = np.sin(np.pi*n/window_length)**2 # sine-window

#windowpos = np.random.randint(int((len(data)-window_length)))
windowpos = 92274

datawin = data[windowpos:(windowpos+window_length), 0]
datawin = datawin/np.max(np.abs(datawin)) # normalize

spectrum = scipy.fft.rfft(datawin*windowing_fn,n=2*window_length)
autocovariance = scipy.fft.irfft(np.abs(spectrum**2))
autocovariance = np.concatenate((autocovariance[window_length:],autocovariance[0:window_length]))

plt.figure(figsize=[10,6])
plt.subplot(211)
plt.plot(n*1000/fs,datawin)
plt.xlabel('Time (ms)')
plt.ylabel('Amplitude')
plt.title('A window of a signal')
plt.subplot(212)
plt.plot(n2*1000/fs,autocovariance)
plt.xlabel('Lag (ms)')
plt.ylabel('Autocovaraince $r_k$')
plt.title('The autocovariance')
plt.tight_layout()
plt.show()

728x90
반응형
LIST