Zastanawiam się, czy używam transformacji Fouriera w MATLAB we właściwy sposób. Chcę mieć wszystkie średnie amplitudy częstotliwości w utworze. Do celów testowych używam a free mp3 download of Beethovens "For Elise", którą konwertowałem na plik fal mono 8 kHz przy użyciu Audacity.Czy używam transformacji Fouriera we właściwy sposób?
Mój kod MATLAB jest następujący:
clear all % be careful
% load file
% Für Elise Recording by Valentina Lisitsa
% from http://www.forelise.com/recordings/valentina_lisitsa
% Converted to 8 kHz mono using Audacity
allSamples = wavread('fur_elise_valentina_lisitsa_8khz_mono.wav');
% apply windowing function
w = hanning(length(allSamples));
allSamples = allSamples.*w;
% FFT needs input of length 2^x
NFFT = 2^nextpow2(length(allSamples))
% Apply FFT
fftBuckets=fft(allSamples, NFFT);
fftBuckets=fftBuckets(1:(NFFT/2+1)); % because of symetric/mirrored values
% calculate single side amplitude spectrum,
% normalize by dividing by NFFT to get the
% popular way of displaying amplitudes
% in a range of 0 to 1
fftBuckets = (2*abs(fftBuckets))/NFFT;
% plot it: max possible frequency is 4000, because sampling rate of input
% is 8000 Hz
x = linspace(1,4000,length(fftBuckets));
bar(x,fftBuckets);
Wyjście wówczas wygląda następująco:
- Może ktoś proszę powiedzieć, czy mój kod jest poprawny? Szczególnie zastanawiam się nad pikami około 0.
- Dla normalizacji, czy muszę podzielić przez
NFFT
lublength(allSamples)
? - Dla mnie nie wygląda to tak naprawdę na wykresie słupkowym, ale myślę, że wynika to z wielu wartości, które knuję?
Dzięki za wszelkie wskazówki!
Czy widziałeś tę stronę: [Używanie FFT do uzyskania prostych wykresów analizy spektralnej] (http://www.mathworks.com/support/tech-notes/1700/1702.html). Ma przykład z dużą ilością wyjaśnień – Amro