Matlab코딩한것을 해석하면서 진행합니다.
해밍윈도우 등은 Matlab함수로 구현 가능하지만 Java에서의 구현을 위하여 일일이 구현하였습니다.
사용한 음성은 umbrella.wav파일입니다.
%test STFT
clear
[Y,FS,NBITS, Readinfo]=wavread('umbrella.wav');
%umbrella.wav라는 파일을 볼러왔습니다.
%Y : 신호정보
%FS : Sampling Frequency 22050Hz
%NBITS: BPS(Bit Per Sample), 16bit
%Readinfo : 파일헤더 구조체. 각종 정보 포함
sound(Y,FS); %사운드 출력
len=length(Y); %음성신호 길이
time=len/FS; %파일의 재생시간: 초당 22050의 신호를 캡처하기 때문에 신호 Y의 길이가 20160이라면 재생시간은 0.9몇초가 된다.
figure;
x=linspace(1,time,len); %그래프의 시간축 설정. 0~0.9몇초를 신호의 길이만큼 분할
plot(x,Y); %신호 그래프 출력
%start stft
y=Y(1:len,1); %음성신호를 y로 옮겨놓았음
%% windowing
R =2^9; % R: window len. Windowing할 때의 창의 길이
W =0.54-0.46*cos(2*pi*(1:R)/R); W=W'; % w :해밍윈도우. 공식 적용한 값
N = 2^(nextpow2(length(W)));%2^9; % N: FFT resolution.주파수 분해능,주파수, 그래프의 날카로움
L = ceil(R*0.1); % L: number of non-overlap samples
overlap = R-L; % Overlap(겹침처리)이 클수록 분해능이 좋음(속이 비거나 차는것) 현재 4
%%Type1
c=1;
h=(1+(len-R))/(1+R/2); %must be integer. 낮을수록 시간축 고분해능. R의 크기에 따라 자동으로 정수값으로 잡도록 하였음
h=fix(h*3/3); %FS/h= overlap
d = zeros((1+R/2),1+fix((len-R)/h));
for b = 0:h:(len-R) %(b+1:b+R)의 길이=윈도우의 길이
u = W.*y((b+1):(b+R));
t = fft(u); %해밍윈도우에 신호값을 곱해준 후 fft를 통하여 주파수도메인으로 분석
d(:,c) = t(1:(1+R/2))'; %각 윈도우 영역마다의 값을 대입
c = c+1;
end;
time=linspace(0,timeleng,size(d,2)); %시간벡터. 재생시간을 그래프 배열크기에 맞추어 분할해줍니다.
freq=linspace(0,FS/2,size(d,1)); %주파수벡터. 위와 같은맥락
[X,Y]=meshgrid(time,freq); %3차원 그래프를 출력하기 위하여 2차원 평면 X와 Y 2개를 만듭니다.
figure;
mesh(X,Y,abs(d)); %spectrogram 출력
STFT Type1
%%Type2
%Matlab내 함수 이용
[S F T] = spectrogram(y,W,overlap,N,FS);
%S : signal
%F : 관측할 수 있는 주파수배열
%T : 관측할 수 있는 시간배열. Overlap에 의한 분해능에 의존
%R에도 의존(Window 크기)
%R>Overlap
Z=abs(S);
[mX,mY]=meshgrid(T,F); %2차원 평면 mX, mY 생성
figure;
mesh(mX,mY,Z);
figure;
contour(mX,mY,Z); %등고선 그래프 출력
STFT_Type2
Contour 그래프
현재 Type1과 Type2의 Spectrogram의 정확도? 가 다르다는걸 눈으로 보아도 알 수 있습니다... 물론 보는 각도 때문에 그렇게 보일수도 있습니다만.
Type1의 경우 overlap을 계산하면 약290이 나옵니다.
반면 Type2의 경우 overlap을 490으로 설정해놓았습니다.
Type1의 h에 대한 식 h=fix(h*3/3); 에서 다음과 같이 바꾸어 보겠습니다.
h=2^(nextpow2(h)); 이때 오버랩은 344정도 나옵니다. 그리고 그래프는
왼쪽이 Type1이고 오른쪽이 아까와 같은 오버랩의 Type2입니다. 거의 똑같죠?
굳이 nextpow쓸 필요는 없구요. h값을 낮추어주면 오버랩이 오릅니다. 오버랩이 클수록 그래프가 좀더 빽빽해지고 속이 덜 비겠죠?
Matlab함수에서 인수로 주는 오버랩 값 등의 제한에 대해서는 직접 함수를 사용해서 확인해보기 바랍니다.
위의 N은 nfft라고 FFT resolution입니다. 이 값이 낮으면 그래프가 삐죽빼죽 날카록게 되요. 덜 연속적이라서 그런거죠.
R값은 window길이인데, 매트랩 함수에서는 이 값도 잘 생각해줘서 넣어줘야 합니다. 높을수록 많은 정보를 담을 수 있겠지만 지나치면 연상량이 너무 많아지겠죠?
STF
2차원의 파워스펙트로그램입니다. 이걸 직접 구현할 수 있으면 좋겠는데 아직 거기까지는 잘 안되네요.
이부분은 추후에 구현하기로 하고 오늘 STFT는 여기서 끝!
다음편은 Mel-Filter bank 적용입니다.
'Project > 음성평가시스템' 카테고리의 다른 글
현재 진행상황 (0) | 2013.08.19 |
---|---|
특징추출3. Mef filter bank 영문설명 (0) | 2013.08.14 |
특징추출1. Preemphasis (0) | 2013.08.12 |
과제진행순서 (0) | 2013.08.08 |
Flow_chart (0) | 2013.08.07 |