Почему мое дискретное преобразование Фурье неверно?

Я создал код, который пытается вычислить DTFT функции.

Это мой код:

figure
n = linspace(0,2*pi,1500); %example
x = cos(n); %example
l = length(n);
syms k w
Xk = sum(x(1:l).*exp((-1i.*k.*2/l.*pi.*(0:l-1))));
Xk = matlabFunction(Xk);
d = linspace(-5,5,1000);
stem(d,Xk(d))

Чтобы проверить свой код, как видите, я попытался вычислить преобразование Фурье с дискретным временем для cos(n), выбрав его и сравнив с преобразованием Фурье с непрерывным временем для cos(x), но, к сожалению, я не получил того же результата.

Вот что я получаю, запуская этот код:

нажмите здесь

и когда я увеличиваю n, хотя значения в -1,1 увеличиваются, как мы и ожидали, ненулевые значения также увеличиваются в противоположность ожидаемому.

(Преобразование Фурье cos(x) равно deltaFunction(x-1)+deltaFunction(x+1))

Спасибо за любую помощь. Я знаю, что в MATLAB есть такие функции, но я пытаюсь создать их самостоятельно.


person omersk3    schedule 23.05.2018    source источник


Ответы (2)


То, что вы видите, является результатом использования нецелочисленных значений k.

ДВПТ:

DTFT предполагает бесконечный входной сигнал. У вас нет этого, у вас есть только один период косинуса. Делая предположение, что остальная часть сигнала состоит из нулей, вы вводите много высоких частот при переходе от 1 к 0 при t=0 и t=2. Вы также вводите некоторые более низкие частоты. Именно эти частоты вы видите на своем графике.

Если вы хотите вычислить DTFT cos(t) с t, не ограниченным одним периодом, тогда вам нужна бесконечная сумма в ваших вычислениях, вы, конечно, не можете этого сделать.

Если вы хотите предположить, что ваш сигнал является периодическим, то вы вычисляете ДПФ.

ТПФ:

У вас есть ряд образцов, которые вы определяете как n = 0:l-1 в вашем преобразовании, где l выполняет функцию N в уравнение, как показано в Википедии:

Уравнение ДПФ

В этом уравнении и n, и k являются целыми числами. k обычно также определяется в диапазоне 0:l-1, но, поскольку он периодический, его можно определить, например, в диапазоне -ceil(l/2):ceil(l/2)-1.

Установив d в набор целочисленных значений в вашем коде, я вижу ожидаемый результат:

d = -10:10;
stem(d,abs(Xk(d)))

выход

person Cris Luengo    schedule 23.05.2018

Во-первых, результат, который вы показали, верен для DTFT косинуса с окном между 0 и 2π. У меня такое чувство, что вы заинтересованы в вычислении ДПФ косинуса от -∞ до +∞, что продемонстрировал Cris Luengo.

Я думаю, что было бы полезно кратко рассказать о преобразовании Фурье косинуса, оконном косинусе и DTFT.


Преобразование Фурье косинуса

Преобразование Фурье косинуса

где косинус определен для t = от -∞ до +∞, который можно вычислить с помощью ДПФ. Но преобразование Фурье оконного косинуса

Оконный косинус

is

Преобразование Фурье оконного косинуса

где N — количество периодов окна (1 выше). Построение этого в MATLAB дает

График преобразования Фурье оконного косинуса

Таким образом, в MATLAB, если вы хотите вычислить DTFT косинуса, ваши входные данные должны быть выборочным косинусом от t = -∞ до +∞, и ваш результат должен быть похож на

График DTFT косинуса

потому что ДПФ периодичен с периодом 2π, а ДПФ — нет. DTFT косинуса

DTFT косинуса

person IKavanagh    schedule 23.05.2018