Как рассчитать ДПФ с dt = 0,02?

Теперь я пытаюсь понять, как работает ДПФ. Итак, я реализовал это с помощью Matlab, чтобы сделать это как приведенный ниже код Matlab.

функция

введите здесь описание изображения

и

введите здесь описание изображения

clear all
clc

N=8;
dt=0.02;
fs=1/dt;
T=0.16;
tspan = (0:N-1)/fs;
y = 5+cos(2*pi*12.5*tspan)+sin(2*pi*18.75*tspan);


X=zeros(1,N);

for k = 0:N-1
    for n = 0:N-1
        X(k+1) = X(k+1) + y(n+1)*exp(-j*(2*pi/N)*k*n);
    end
end

x_mag = abs(X);
plot(0:N-1,x_mag);

Я ожидал такого результата

введите здесь описание изображения

но у меня есть

введите здесь описание изображения

Что я должен сделать, чтобы получить правильный результат?

Обновить

Если я прибавлю N к 80 из 8, то у меня получится приведенный ниже график, но этот результат также кажется неверным.

введите здесь описание изображения

частота отображается как 20 и 30, а не 12,5 и 18,75.

Обновление №1

Я нашел какие-то правила с приведенным ниже кодом Matlab. Когда я использую N=350, введите здесь описание изображения

   dt=0.02 
    fs=1/dt % hz = 1/0.02 (delta T)

     N=350;

     tspan = (0:N-1)*dt; 
     y = 5+cos(2*pi*12.5*tspan)+sin(2*pi*18.75*tspan);

    X=y;

    X=zeros(1,N);

    for k = 0:N-1
        for n = 0:N-1
            X(k+1) = X(k+1) + y(n+1)*exp(-j*(2*pi/N)*k*n);
        end
    end

    x_mag = abs(X);
    plot(0:N-1,x_mag);

и когда у меня есть N = 50, я могу на приведенном ниже графике ввести здесь описание изображения

Я думаю, когда у меня N=50, это кажется более правильным результатом.

Но я не могу понять, как мы определяем правильное N?


person start01    schedule 13.11.2017    source источник
comment
Если у вас есть 8 сэмплов, у вас недостаточно информации, чтобы правильно описать контент с частотой 12,5 Гц и 18,75 Гц. Вам нужно больше очков. Также ваше смещение постоянного тока (содержимое 0 Гц) не удаляется. Вычтите среднее значение, чтобы удалить этот контент.   -  person Matt    schedule 13.11.2017
comment
@Matt Спасибо, что сообщили мне об этом, но я не совсем понял. Не могли бы вы сообщить мне, сколько баллов мне нужно? и как я могу удалить смещение постоянного тока?   -  person start01    schedule 13.11.2017
comment
@start01 Связано с этим вопросом dsp.stackexchange.com /questions/2857/ Также ознакомьтесь с Теорема Найквиста о выборке   -  person jodag    schedule 13.11.2017
comment
@jodag Спасибо, я думаю, вы хотите сказать, что номер образца должен быть таким же, как номер Найквиста.   -  person start01    schedule 13.11.2017
comment
@start01 да. Больше тоже хорошо, но не меньше.   -  person jodag    schedule 13.11.2017
comment
Вы строите график не по частоте, а по индексу, см. ответ здесь: fft   -  person Irreducible    schedule 13.11.2017


Ответы (1)


Вы получаете именно тот результат, который должны получить. Прочтите описание функции здесь.

Итак, что происходит, когда вы сэмплируете 80 точек во времени, это означает, что вы получаете 80 точек в частотном пространстве. Поскольку ваша функция реальна, а не сложна, ДПФ симметричен и расположен примерно в середине 80 отсчетов, что означает около 40.

(И вы также рисуете в индексном, а не в частотном пространстве!)

От 40 у вас есть симметричное преобразование Фурье с одинаковыми положительными и отрицательными частотами (реальная функция во временном пространстве). Если вы считаете от 40, вы, вероятно, получите пики ровно на 12,5 (52,5) и 18,75 (58,75) Гц, как и хотели.

Надеюсь это поможет.

Некоторый код из документации:

Y = fft(X);
P2 = abs(Y/L);
P1 = P2(1:L/2+1);
P1(2:end-1) = 2*P1(2:end-1);

f = Fs*(0:(L/2))/L;
plot(f,P1) 
title('Single-Sided Amplitude Spectrum of X(t)')
xlabel('f (Hz)')
ylabel('|P1(f)|')
person Dorian    schedule 13.11.2017
comment
Спасибо, но теперь я пытаюсь реализовать без MATLAB функцию БПФ. - person start01; 13.11.2017
comment
Это должно работать так же с вашей пользовательской функцией. Это в основном та же функция, вы получаете тот же результат. Просто возьмите половину длины, так как вы и переиндексируете свои результаты, чтобы они отображали частоты. - person Dorian; 13.11.2017
comment
Спасибо, я думаю, что видел это раньше на сайте MATLAB. Но я не могу понять, как мы определяем правильный N в моем случае? и как это объяснить в случае N=50 и N=350? у них разные результаты. - person start01; 13.11.2017
comment
у них нет разных результатов. Разрешение лучше для более высоких N, и оно должно работать до тех пор, пока вы не опускаетесь ниже предела Найквиста. Вы получаете частоты путем масштабирования по соответствующей формуле (я думаю, что это df = Fs/N, с частотой дискретизации Fs) - person Dorian; 13.11.2017