БПФ Matlab не показывает правильную частоту с измеренным сигналом, сценарий, проверенный с помощью синусоидального сигнала, работает

#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)); и это работает. Я также попробовал ваш код, который дает мне тот же результат. Спасибо, что ответили 🙂