#matlab #fft
Вопрос:
Привет, ребята, у меня возникли некоторые проблемы с получением правильной частоты в моем сценарии FFT Matlab. Я протестировал сценарий с синусоидальным сигналом, и он работает просто отлично. но почему-то мой измеренный сигнал (помещенный в файл txt, см. Ниже) не дает мне нужной частоты. На первом графике я строю свой сигнал, и там я измерил и рассчитал вручную частоту, которая должна быть 33,333 кГц
% Parameter
td = 100*4e-6; % Duration of the measurement ( i honestly just put something here)
fs = 250e3; % samplingfrequency
% Frequency to be detected (measured from data in plot)
freq_soll_20 = 1/(7.2e-5 - (4.4e-5 4e-5)/2);
% Samples calc
s_20 = readmatrix('fft_cut_20.txt');
t_20 = 0:1/fs:((length(s_20)-1)*1/fs);
%% ---- Triggerdata
figure(1)
subplot(3,1,1);
plot (t_20, s_20)
grid on;
xlabel('Zeit (ms)');
ylabel('ADC LSB');
title('20um');
h_20=fft(s_20).*1/length(s_20);
f_20=1/td*(0:(length(t_20)-1));
subplot(3,1,2);
stem(f_20,abs(h_20));
grid on;
xlim([min(f_20) max(f_20)]);
xlabel('Frequenz (Hz)');
ylabel('Amplitude');
title('Ausgabe des FFTs');
subplot(3,1,3);
f2_20=f_20-round(max(f_20)/2);
stem(f2_20, fftshift(abs(h_20)));
grid on;
xlabel('Frequenz (Hz)');
ylabel('Amplitude');
title(['Ausgabe des FFTs nach sortieren mit FFTSHIFT mit soll frequenz:'...
num2str(freq_soll_20) 'Hz']);
данные являются:
11284, 11601, 12033, 12355, 12344, 11985, 11558, 11444, 11807, 12491, 13090, 13199, 12694, 11878, 11290, 11500, 12855
мой БПФ дает мне частоту 1250*10^4 Гц.
Я протестировал этот код с помощью синуса с этими параметрами, и он работал просто отлично:
%Parameter
fs = 250000; % Abtastrate
td = 100*4e-6; % Dauer der Messung
f1 = 30000; % Frequenz
% Samples berechnen
t = 0:(1/fs):td;
s = sin(2.*pi.*f1.*t);
Я что-то упускаю?
Ответ №1:
Правильная формула для частот была бы:
f_20=(0:(length(t_20)-1))*fs/length(t_20);
Ваша формула f_20=1/td*(0:(length(t_20)-1));
будет эквивалентна всякий td
раз, когда соответствует общей длительности сигнала, что относится к вашей синусоидальной волне. То же самое нельзя сказать о вашем другом сигнале, который содержит всего 17 выборок, в то td=100*4e-6
время как частота дискретизации 250 кГц соответствует 100 выборкам.
Комментарии:
1. я рассматривал проблему с коллегой, и мы пришли к такому решению: f_20= 1/(длина(s_20)/fs)*(0:(длина(t_20)-1)); и это работает. Я также попробовал ваш код, который дает мне тот же результат. Спасибо, что ответили 🙂