Podręcznik

6. Ćwiczenia do modułu (rozwiązane problemy praktyczne - zadania, projekty)

6.3. Analiza czasowo-częstotliwościowa – krótkoczasowa transformata Fouriera

Licząc widmo z wykorzystaniem transformaty Fouriera nie mamy żadnej informacji o zmianach częstotliwości sygnału badanego w czasie. W pewnych przypadkach taka informacja jest bardzo pomocna. Można ją uzyskać stosując któtkoczasową transformatę Fouriera.

Załóżmy, że mamy sygnał y, którego częstotliwość zmienia się w funkcji kwadratowej w czasie od 100 Hz do 880 Hz. Fragment tego sygnału przedstawiony jest na rys. 6.8. Jeśli policzymy widmo amplitudowe tego sygnału, to otrzymamy wynik zaprezentowany na rys. 6.9.

 

Rys. 6.8. Sygnał y o zmiennej częstotliwości

 

Rys. 6.9. Widmo amplitudowe sygnału y o zmiennej częstotliwości

Rys. 6.10. Spektrogram sygnału o zmiennej częstotliwości

W widmie można znaleźć prążki reprezentujące wszystkie częstotliwości  z przedziału 100-880 Hz, ale nie wiemy, w której chwili czasowej one występowały. Dużo więcej informacji można uzyskać stosując krótkoczasową transformatę Fouriera. W tym przypadku wynikiem analizy jest spektrogram zaprezentowany na rys. 6.10. Dominujące częstotliwości w sygnale (kolor żółty na rysunku) zaprezentowane są na płaszczyźnie czas-częstotliwość. Łatwo można odczytać, że na początku sygnału (dla t=0) częstotliwość wynosiła 100Hz, dla t=1 sek. częstotliwość jest równa 300 Hz itd. Widać też, że częstotliwość zmienia się w funkcji kwadratowej z czasem.

Skrypt Matlaba liczący widmo i spektrogram sygnału o zmiennej częstotliwości przedstawiony jest na Listingu 6.3.

clear<br /> close all<br />  <br /> % Częstotliwość próbkowania<br /> Fs=2000;<br />  <br /> tp=1/Fs;<br />  <br /> % Czas analizy sygnału<br /> t=0:tp:2; % częstotliwość próbkowania Fs=2000Hz; czas końcowy tk=2s<br />  <br /> % Analizowany Sygnał<br /> % t0 odpowiada f=100Hz; t=1s odpowiada f=300Hz<br /> y=chirp(t,100,1,300,&#39;quadratic&#39;);<br />  <br /> M=length(y);<br />  <br /> % Obliczenie widma<br /> wid=abs(fft(y));<br /> N=length(wid);<br /> wid(1)=wid(1)/N;<br /> wid(2:end)=wid(2:end)./(N/2);<br />  <br /> df=Fs/N;<br /> fprintf(&#39;Rozdzielczość analizy = %1.2f Hz\n&#39;,df);<br /> f=0:df:(Fs-df);<br />  <br /> figure(1)<br />  <br /> subplot(211)<br /> %plot(t,y,&#39;b&#39;);<br /> plot(t(1:1000),y(1:1000),&#39;b&#39;);<br /> axis tight;<br /> grid on<br /> xlabel(&#39;Czas&#39;)<br /> ylabel(&#39;Amplituda&#39;)<br /> title(&#39;Sygnal&#39;)<br />  <br /> subplot(212)<br /> stem(f(1:fix(N/2)),wid(1:fix(N/2)),&#39;.&#39;);<br /> axis tight;<br /> grid on<br /> xlabel(&#39;Czestotliwosc&#39;)<br /> ylabel(&#39;Amplituda&#39;)<br /> title(&#39;Widmo&#39;)<br />  <br /> figure(2)<br /> % Obliczenie spektrogramu<br /> spectrogram(y,256,250,256,Fs,&#39;yaxis&#39;);
 

Listing 6.3. Skrypt Matlaba liczący widmo i spektrogram sygnału o zmiennej częstotliwości

 

Na rys. 6.11 przedstawiony jest wynik zastosowania krótkoczasowej transformacji Fouriera do sygnału mowy (kolejno wypowiadane słowa „jeden, dwa, trzy, cztery, pięć”). Widać złożoność takiego sygnału. Można zauważyć podstawową częstotliwość wypowiadanych słów oraz poszczególne harmoniczne.

 

Rys. 6.11. Spektrogram głosu

 

Skrypt Matlaba liczący spektrogram sygnału mowy przedstawiony jest na Listingu 6.4.

clear<br /> close all<br />  <br /> [y2,Fs]=audioread(&#39;..\sounds\123.wav&#39;);<br />  <br /> figure(1)<br /> spectrogram(y2,kaiser(2048,8),2000,4096,Fs,&#39;yaxis&#39;);<br /> colormap jet<br /> xlabel(&#39;Time [Seconds]&#39;); ylabel(&#39;Frequancy [Hz]&#39;);<br />  <br /> pause (1)<br /> ylim([0 Fs/(5*2*1000)])
 

Listing 6.4. Skrypt Matlaba liczący spektrogram sygnału mowy

 

Korzystając z załączonych skryptów (Listing 5.3 i 5.4) proszę policzyć spektrogramy innych sygnałów.