Частотный спектр сигнала в Matlab

Вот код, который я использую для построения графика функции в частотной области в Matlab:

    dt = 1/10000; % sampling rate
    et = 0.1; % end of the interval
    t = 0:dt:et; % sampling range
    y = 2+sin(2.*pi.*50.*t)+18.*sin(2.*pi.*90.*t)+6.*sin(2.*pi.*180.*t); %     sample the signal
    subplot(2,1,1); % first of two plots
    plot(t,y); grid on % plot with grid
    xlabel('Time (s)'); % time expressed in seconds
    ylabel('Amplitude'); % amplitude as function of time
    Y = fft(y); % compute Fourier transform
    n = size(y,2)/2; % 2nd half are complex conjugates
    amp_spec = abs(Y)/n; % absolute value and normalize
    subplot(2,1,2); % second of two plots
    freq = (0:100)/(2*n*dt); % abscissa viewing window
    stem(freq,amp_spec(1:101)); grid on % plot amplitude spectrum
    xlabel('Frequency (Hz)'); % 1 Herz = number of cycles/second
    ylabel('Amplitude'); % amplitude as function of frequency

Проблема в том, что когда я увеличиваю свой график, я не вижу пиков точно на 50 Гц, 90 Гц и 180 Гц.

Что я сделал не так в своем коде?


person etf    schedule 07.04.2015    source источник
comment
Вы должны попробовать либо установить более высокое значение dt (например, 1/1000), либо/и нанести больше точек freq, freq=(0:1000)/2*n*dt. Также убедитесь, что size(y,2) является четным значением.   -  person eventHandler    schedule 08.04.2015
comment
Привет, eventHandler, я пробовал, но это не помогло.   -  person etf    schedule 08.04.2015


Ответы (1)


Проблема в том, что для получения идеальных спектров (пики на 50, 90, 180 и 0 в противном случае) ваш интервал должен быть множителем всех частот.

Объяснение: рассмотрим y=sin(2.*pi.*t). Используйте свой код, чтобы построить его с помощью:

1) et = 1-dt;

2) et = 1;

В первом случае, если вы увеличите масштаб, вы увидите, что пик точно соответствует 1 Гц. Во втором случае нет (тоже очень близко).

Почему? Потому что вы работаете с конечным числом точек, а, следовательно, с конечным числом частот. Если среди этого набора частот есть 1 Гц (1-й случай), вы получите идеальный пик на 1 Гц при нулях на всех остальных частотах.

В случае 2 в вашем наборе нет частоты 1 Гц, поэтому вы получите пик на ближайших частотах (а также он будет иметь конечную ширину).

В конечном счете, в вашем исходном коде нет частот 50, 90, 180 Гц в вашем полном наборе частот.

person Mikhail Genkin    schedule 07.04.2015
comment
Спасибо за ответ Михаил Генкин. Значит, я ничего не могу сделать для идеального сюжета? - person etf; 08.04.2015
comment
Используйте et = 0.1-dt; вместо et=0.1. - person Mikhail Genkin; 08.04.2015