본문 바로가기
Linguistic Intelligence/Audio Processing

윈도우 기법 (Windowing)

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

윈도우 기법 (Windowing)

 

음성 문장은 일련의 음소 (phonemes)다. 따라서, 음성 신호는 성격이 시변적 (time-variant)이다. 따라서 신호에서 정보를 추출하려면 신호를 충분히 짧은 세그먼트로 분할해야 한다. 즉, 경험적으로 말하면 각 세그먼트에는 하나의 음소만 포함된다. 즉, 음성 신호의 속성이 해당 세그먼트 내에서 시간 변화를 갖지 않을 만큼 충분히 짧은 세그먼트를 추출해야 한다.

 

윈도우 기법은 신호 처리의 고전적인 방법으로, 입력 신호를 시간적 세그먼트로 분할하는 것을 의미한다. 그러면 세그먼트의 경계가 실제 신호와 일치하지 않는 불연속성으로 표시된다. 신호의 통계적 속성에 대한 분할의 영향을 줄이기 위해 시간 세그먼트에 윈도우 기법을 적용한다. 윈도우 함수는 경계에서 0으로 가는 부드러운 함수이다. 입력 신호에 윈도우 함수를 곱하면 윈도우 함수도 경계에서 0이 되어 경계의 불연속성이 보이지 않게 된다. 따라서, 윈도우 기법은 신호를 변경하지만 신호 통계에 미치는 영향이 최소화되도록 변경이 설계되었다.

 

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

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

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

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

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

datawin = data[38000:(38000+window_length), 0]
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 without a windowing function (i.e. rectangular window)')
plt.axis([-10.,45.,-1.,1.])
plt.tight_layout()
plt.show()

nx = np.concatenate(([-1000,0.],n,[window_length,window_length+1000]))
datax = np.concatenate(([0.,0.],datawin,[0.,0.]))
plt.plot(nx*1000/fs,datax)
plt.xlabel('Time (ms)')
plt.ylabel('Amplitude')
plt.title('Signal with a rectangular window looks as if it had a discontinuity at the borders')
plt.axis([-10.,45.,-1.,1.])
plt.tight_layout()
plt.show()

nx = np.concatenate(([-1000,0.],n,[window_length,window_length+1000]))
datax = np.concatenate(([0.,0.],datawin*windowing_fn,[0.,0.]))
plt.plot(nx*1000/fs,datax,label='Windowed signal')
plt.plot(n*1000/fs,windowing_fn,'--',label='Window function')
plt.legend()
plt.xlabel('Time (ms)')
plt.ylabel('Amplitude')
plt.title('Signal with a Hann window looks as if it would be continuous')
plt.axis([-10.,45.,-1.,1.])
plt.tight_layout()
plt.show()

 

서로 다른 요구 사항을 가진 두 가지 서로 다른 윈도우 기법인 분석과 처리가이 있다. 분석에서는 주어진 계산 제약 조건에 따라 최대한 정확하게 정보를 추출하는 데에만 관심이 있는 반면, 어플리케이션 처리에서는 일련의 창에서 신호를 다시 생성하는 기능도 필요하다.

 

분석을 위한 윈도우 기법

 

이것은 신호 처리에 고전적인 신호 처리 주제이다. 윈도우 기능을 선택할 때 주요 최적화 기준은 스펙트럼 왜곡 (spectral distortion)이다. 즉, 윈도잉된 신호가 원래 신호와 최대한 유사하기 위함이다. 하지만 표본이 짧아서 정확할 수는 없다. 윈도우잉은 시간 영역에서의 곱셈이므로 주파수 영역에서의 컨볼루션에 해당한다. 따라서, 윈도잉 함수의 스펙트럼을 보면 윈도잉 함수를 적용할 때 주파수의 피크 확산이 얼마나 발생하는지 확인할 수 있다.

 

import numpy as np
import matplotlib.pyplot as plt

# window parameters in milliseconds
window_length_ms = 30
fs = 16000

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

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

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

plt.plot(n*1000/fs,windowing_fn)    
plt.xlabel('Time (ms)')
plt.ylabel('Amplitude')
plt.title('A Hann-window of 30ms length')
plt.show()

 

어플리케이션 처리를 위한 윈도우 기법 : 중첩 (overlap) 추가

 

일부 처리를 통해 윈도우 신호를 수정하려는 경우 가장 일반적인 접근 방식은 중첩 추가라는 기술을 사용하는 것이다. 신호의 겹치는 창을 추출하고 일부 처리를 적용한 다음 두 번째로 창을 적용한 다음 겹치는 세그먼트를 함께 추가하여 재구성한다.

분명한 요구 사항은 신호가 수정되지 않은 경우 원래 신호를 완벽하게 재구성할 수 있다는 것이다. 윈도잉 함수의 중첩 영역이 합쳐지면 완벽한 재구성이 달성된다는 것을 입증하는 것은 간단하다. 여기서는 윈도잉이 두 번 적용된다는 점을 고려해야 한다.

 

728x90
반응형
LIST

'Linguistic Intelligence > Audio Processing' 카테고리의 다른 글

단시간 푸리에 변환 (STFT)  (0) 2024.04.23
Sound Energy  (0) 2024.04.23
파형 (Waveform)  (0) 2024.03.27
Mel-Frequency Cepstral Coefficients (MFCC)  (0) 2024.03.20
캡스트럼 (Cepstrum)  (0) 2024.03.20