'STFT'에 해당되는 글 1건

  1. 2013.08.13 특징추출2. 영어음성 STFT하기 1

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
Posted by 십자성군