Неожиданный результат с DFT в MATLAB
У меня есть проблема, когда вычисление дискретного преобразования Фурье в MATLAB, по-видимому, дает правильный результат, но при построении амплитуды полученных частот вы можете увидеть значения, очень близкие к нулю, которые должны быть точно равны нулю. Я использую свою собственную реализацию:
function [y] = Discrete_Fourier_Transform(x)
N=length(x);
y=zeros(1,N);
for k = 1:N
for n = 1:N
y(k) = y(k) + x(n)*exp( -1j*2*pi*(n-1)*(k-1)/N );
end;
end;
end
Я знаю, что лучше использовать fft из MATLAB, но мне нужно использовать свою собственную реализацию, как для колледжа.
Код, который я использовал для генерации прямоугольной волны:
x = [ones(1,8), -ones(1,8)];
for i=1:63
x = [x, ones(1,8), -ones(1,8)];
end
Версия MATLAB: R2013a(8.1.0.604) 64 бит
Я перепробовал все, что случилось со мной, но у меня нет большого опыта использования MATLAB, и я не нашел информации, имеющей отношение к этой проблеме, на форумах. Я надеюсь, что кто-то может помочь мне.
Заранее спасибо.
1 ответ
Это будет численная проблема. Значения находятся в диапазоне 1e-15
в то время как ДПФ вашего сигнала имеет значения в диапазоне 1e+02
, Скорее всего, это не приведет к ошибкам при дальнейшей обработке. Вы можете рассчитать общую квадратическую ошибку между вашим DFT и MATLAB fft
функция по
y = fft(x);
yh = Discrete_Fourier_Transform(x);
sum(abs(yh - y).^2)
ans =
3.1327e-20
который в основном равен нулю. Поэтому я бы пришел к выводу: ваша функция DFT работает просто отлично.
Одно небольшое замечание: вы можете легко векторизовать DFT.
n = 0:1:N-1;
k = 0:1:N-1;
y = exp(-1j*2*pi/N * n'*k) * x(:);
С n'*k
Вы создаете матрицу со всеми комбинациями n
а также k
, Затем вы берете exp(...)
каждого из этих матричных элементов. С x(:)
ты уверен x
является вектором столбца, так что вы можете сделать умножение матрицы (...)*x
которая автоматически суммирует все k
"S. На самом деле, я просто замечаю, что это точно известная матричная форма ДПФ.