Podręcznik
6. Ćwiczenia do modułu (rozwiązane problemy praktyczne - zadania, projekty)
6.2. Analiza częstotliwościowa – szybka transformata Fouriera
Szybka transformata Fouriera umożliwia policzenie charakterystyk widmowych sygnału określonego w czasie. Zwykle bardziej interesuje nas amplitudowa charakterystyka widmowa. W pierwszym ćwiczeniu zostanie policzona charakterystyka amplitudowa sygnału sinusoidalnego. Najpierw należy wygenerować sygnał sinusoidalny jak na rys. 6.3 (amplituda 1, faza 0, częstotliwość sygnału 10Hz, czas trwania 0.2 s, częstotliwość próbkowania 200 Hz). Odpowiedni skrypt Matlaba jest zaprezentowany na Listingu 5.1.
Szybka transformata Fouriera umożliwia policzenie charakterystyk widmowych sygnału określonego w czasie. Zwykle bardziej interesuje nas amplitudowa charakterystyka widmowa. W pierwszym ćwiczeniu zostanie policzona charakterystyka amplitudowa sygnału sinusoidalnego. Najpierw należy wygenerować sygnał sinusoidalny jak na rys. 6.3 (amplituda 1, faza 0, częstotliwość sygnału 10Hz, czas trwania 0.2 s, częstotliwość próbkowania 200 Hz). Odpowiedni skrypt Matlaba jest zaprezentowany na Listingu 5.1.
Rys. 6.3. Sygnał sinusoidalny
Następnie, korzystając z szybkiej transformaty Fouriera, policzymy widmo amplitudowe tego sygnału stosując okno prostokątne (rys. 6.4).
Rys. 6.4. Widmo amplitudowe sygnału sinusoidalnego – analiza synchroniczna
Prążek w częstotliwości 0 Hz odpowiada wartości składowej stałej. Prążek w 10 Hz jest składową sinusoidalną o częstotliwości 10 Hz i amplitudzie 1 (wysokość prążka). Częstotliwość próbkowania jest równa 200 Hz. Zatem zakres analizy jest równy połowie częstotliwości próbkowania i wynosi 100 Hz. Prążek w 190 Hz jest odbiciem lustrzanym widma względem częstotliwości Nyquista (100 Hz w tym przypadku) i nie niesie żadnej dodatkowej informacji. W tym przypadku mamy do czynienia z analizą synchroniczną, dla której parametry są tak dobrane, że analiza obejmuje całkowitą liczbę okresów sygnału badanego. Jest to szczególny przypadek, który trudno jest uzyskać w warunkach rzeczywistych. Częstszym przypadkiem jest tzw. analiza asynchroniczna (rys. 6.5).
Rys. 6.5. Widmo amplitudowe sygnału sinusoidalnego - analiza asynchroniczna
Wyraźnie widać, że w widmie występuje dużo więcej prążków niż wynikałoby to z teorii. Jest to wynikiem tzw. przecieku widma. W tym przypadku rozdzielczość analizy wynosi 4 Hz, zatem punkty, w których obliczane są prążki widma to 0, 4, 8, 12, 16 … Hz. Nie można wystawić prążka dla 10 Hz. Prążki „rozpływają się” na sąsiednie. Amplituda najwyższego prążka jest równa 0.7 (a nie 1, jak było dla analizy synchronicznej). Widmo jest trudniej zinterpretować. Taka analiza jest najczęściej spotykana w warunkach rzeczywistych.
W drugim ćwiczeniu policzmy widmo amplitudowe sygnału prostokątnego. Dla analizy synchronicznej otrzymujemy przebiegi jak na rys. 6.6. Wyraźnie widać kolejne nieparzyste harmoniczne (10, 30, 50, 70, 90 Hz) wchodzące w skład sygnału prostokątnego.
Rys. 6.6. Sygnał prostokątny i jego widmo amplitudowe – analiza synchroniczna
Proszę sprawdzić jak wygląda widmo w przypadku analizy asynchronicznej. Jeśli chcemy zwiększyć zakres analizy widmowej wystarczy zwiększyć częstotliwość próbkowania, jeśli chcemy zwiększyć rozdzielczość analizy należy wydłużyć czas analizy. Proszę sprawdzić jak to działa w praktyce wykorzystując załączony skrypt Matlaba.
Skrypt Matlaba obliczający widmo sygnałów sinusoidalnego i prostokątnego jest zamieszczony na Listingu 6.1.
clear;<br />
clc;<br />
close all;<br />
<br />
%częstotliwość próbkowania<br />
Fs=200;<br />
<br />
%parametry sygnału<br />
fsyg=10;<br />
ok=1/fsyg;<br />
A=1;<br />
faza=0;<br />
sks=0.5;<br />
<br />
T=1/Fs;<br />
%czas analizy sygnału<br />
t=0:T:((4*ok)-T);<br />
<br />
%y=A*sin(2*pi*fsyg*t+faza)+sks;<br />
y=A*square(2*pi*fsyg*t+faza)+sks;<br />
<br />
figure<br />
plot(t,y,'-o');<br />
grid on;<br />
<br />
xlabel('Czas')<br />
ylabel('Amplituda')<br />
title('Sygnal')<br />
<br />
%liczba punktów sygnału i widma<br />
N=length(y);<br />
<br />
%obliczenie widma sygnału<br />
widmo=abs(fft(y));<br />
widmo(1)=widmo(1)/N;<br />
widmo(2:end)=widmo(2:end)./(N/2);<br />
<br />
dFs=Fs/N;<br />
f=0:dFs:Fs-dFs;<br />
<br />
figure<br />
stem(f,widmo,'-*r')<br />
axis tight<br />
xlabel('Hz');<br />
ylabel('Amplituda')<br />
title('Widmo amplitudowe')
Listing 6.1. Skrypt liczący widmo sygnałów sinusoidalnego i prostokątnego
W trzecim ćwiczeniu przeprowadzimy analizę widmową krótkiego sygnału dźwiękowego. Jest to dźwięk E1 grany na piszczałce (rys. 6.7). Widać poszczególne harmoniczne (kolejne wielokrotności) częstotliwości podstawowej.
Rys. 6.7. Sygnał dźwiękowy i jego widmo amplitudowe
Dodatkowe ćwiczenia:
Zmienić częstotliwość próbkowania sygnału i liczbę próbek w oknie czasowym. Zaobserwować wpływ tych parametrów na rozdzielczość analizy widmowej. Podać zależności określające zakres i rozdzielczość analizy widmowej.
Zastosować różne okna czasowe i zaobserwować ich wpływ na kształt widma. Podać jakie okna i w jakich przypadkach dają najlepsze efekty analizy.
Skrypt Matlaba realizujący analizę widmową sygnału dźwiękowego jest przedstawiony na Listingu 6.2.
clc<br />
clear<br />
close all<br />
<br />
% Wczytanie pliku dźwiękowego<br />
plik='.\sounds\E1.wav';<br />
[wav, fp] = audioread(plik);<br />
<br />
lprob=length(wav);<br />
tk=lprob/fp;<br />
t=linspace(0,tk,lprob);<br />
<br />
figure(1)<br />
subplot(211)<br />
plot(t,wav);<br />
grid on<br />
<br />
% Obliczenie widma sygnału dźwiękowego<br />
yw=abs(fft(wav));<br />
yw(1)=yw(1)/lprob;<br />
yw(2:end)=yw(2:end)./(lprob/2);<br />
f=linspace(0,fp,lprob);<br />
<br />
subplot(212)<br />
semilogy(f(1:ceil(lprob/2.5)),yw(1:ceil(lprob/2.5)));<br />
grid on<br />
axis tight
Listing 6.2. Skrypt liczący widmo sygnału dźwiękowego