Мне нужна помощь в настройке правильного вектора частоты

У меня волна с частотой 100 Гц (это набор данных). Я хотел бы построить амплитуду и фазовый угол в зависимости от частоты. Это то, что я делаю, но моя амплитуда показывает на неправильной частоте, что я пропускаю?

given x=[....] set of data representing wave of frequency = 100 Hz, of length 1500.
first: Nfft = 2^nextpow2(length(x));
second: Fs = 1000; (that is 10 times my frequency of 100, is that correct?)
third: get fft : xdft = fft(x,Nfft);
forth: get amplitude: amp = abs(xdft);
fifth: get phase :    ang = unwrap(angle(xdft));

Теперь моя главная проблема - правильно настроить вектор частоты, вот что я сделал

f_fold = Fs/2; % folding frequency = max frequency of FFT (Hz)
T = Nfft/Fs % total sample time (s)
del_f = 1/T; % (Hz)
f_v = [0:del_f:f_fold]'; % frequency (Hz)

Я также попробовал предложение Matlab: f_v = Fs*(0:Nfft-1)/Nfft

Но мои амплитуды всегда показывают неправильную частоту. Что я могу сделать, чтобы это исправить? Спасибо

1 ответ

Решение

Во-первых, FS (ваша частота дискретизации) не является произвольной. Если вам дан набор данных во временной области, то частота выборки этих данных уже определена. Вы можете получить более высокую частоту дискретизации, увеличив частоту дискретизации (интерполируя между существующими точками данных) или уменьшив частоту дискретизации (понижающую дискретизацию), удалив точки данных.

Во-вторых, когда вы берете FFT вектора строки в Matlab, вы получаете обратно

[positive frequency data, negative frequency data]

Функция fftshift может использоваться, чтобы поместить это в более "видимый" формат.

fftshift(fft(x))

вернусь

[negative frequency data, positive frequency data]

Без вашего набора данных я не могу дать точного решения, почему ваши амплитуды не совпадают (хотя я подозреваю, что это связано с вашим выбором частоты дискретизации). Тем не менее, вот пример, иллюстрирующий понятия.

fs = 500; % 500 Hz sampling frequency: 500 > 2*100 => satifies Nyquist
t = 0:1/fs:10; % 10 seconds of data sampled at fs
y = sin(2*pi*100.*t) + sin(2*pi*25.*t); % Two sinusoids at 25 Hz and 100 Hz
Y=fftshift(fft(y));
f=linspace(-fs/2, fs/2, length(Y));
plot(f, abs(Y));

У вас должно быть четыре пика амплитуды при -100, -25, 25 и 100.

Вот еще один пример, который немного больше напоминает ваш код.

fs = 500; % 500 Hz sampling frequency: 500 > 2*100 => satifies Nyquist
t = 0:1/fs:10; % 10 seconds of data sampled at fs
y = sin(2*pi*100.*t) + sin(2*pi*25.*t); % Two sinusoids at 25 Hz and 100 Hz
NFFT = 2^nextpow2(y); %8192
Y=fft(y, NFFT);
delta_f = fs/(NFFT-1);
f=0:delta_f:fs/2;
plot(f, abs(Y(1:length(f)));

Вы можете использовать мой маленький инструмент easyFFT. Он вычисляет правильный вектор частоты для вас в дополнение к БПФ.

Другие вопросы по тегам