Нахождение односекундной выборки преобразования Фурье в Matlab

Я пишу код MATLAB, который считывается в звуковом файле wav, а затем принимает преобразование Фурье полученного сигнала. Я пытаюсь найти частоты в звуке (которые должны быть около 1000-4000 Гц) для 1-секундных сегментов звука, но мой файл возвращает мне частоты ближе к 500 Гц и ниже.

Мой код разбивает сигнал на секунды, а затем выполняет преобразование Фурье каждой секунды. (в моем звуковом файле около 15 секунд).

Fs - частота дискретизации. L - длина образца

[signal, Fs, bits] = wavread ('sound.wav');
L=length(signal);
f=Fs*linspace(0,1,L/2+1);

one_sec_sample=zeros(Fs,15);
Y_code = zeros(Fs,15);

for i=1:15
  one_sec_sample(:,i) = signal(((i-1)*Fs+1):(i*Fs));
  Y_code(:,i) = fft(one_sec_sample(:,i));
end

figure (1);
%plotting 1 second of the transform. Fs is 16000 for my sound.
plot(f(1:16000),abs(Y_code(1:16000)));

Когда я рисую любую секунду файла, частоты не так велики, как предполагалось. Я думаю, что моя индексация может быть неправильной, но я не могу найти, где я пропустил.


person amanda    schedule 30.11.2011    source источник
comment
Возможно, вам будет проще использовать periodogram, а не fft.   -  person Paul R    schedule 30.11.2011


Ответы (1)


Для БПФ данных в 1 секунду результирующий диапазон частот составляет от 0 до FS / 2 для индексов от 0 до половины длины вашего БПФ. Другая половина, для реального ввода, является просто сопряженным симметричным отражением первой половины.

person hotpaw2    schedule 30.11.2011