В рамках курса по обработке сигналов в университете нас попросили написать алгоритм в Matlab для расчета одностороннего спектра нашего сигнала с использованием DFT, без использования функции fft()
, встроенной в matlab.это не оцениваемая часть курса, я просто заинтересован в том, чтобы сделать это «правильным» для себя.В настоящее время я использую версию Matlab 2018b, если кто-нибудь сочтет это полезным.
Я построил сигнал синусоиды 1 кГц и 2 кГц, сдвинутый по фазе на 135 градусов (2 * пи / 3 рад).
затем, используя уравнения в 9.1 из Обработка сигнала с дискретным временем (Аллан В. Оппенгейм) и формулу Эйлера для упрощения показателя степени, я создаю этот код:
%%DFT(currently buggy)
n=0;m=0;
for m=1:DFT_N-1 %DFT_Fmin;DFT_Fmax; %scrolls through DFT m values (K in text.)
for n=1:DFT_N-1;%;(DFT_N-1);%<<redundant code? from Oppenheim eqn. 9.1 % eulers identity, K=m and n=n
X(m)=x(n)*(cos((2*pi*n*m)/DFT_N)-j*sin((2*pi*n*m)/DFT_N));
n=n+1;
end
%m=m+1; %redundant code?
end
Это принимает х в качестве входа, в этом случае сигнал, упомянутый ранее, а также разрешение преобразования, как представлено DFT_N, который был инициализирован до 100. Выход этой функции, X, должен быть чем-то вчастотная область, но построение графика X дает круговой график, немного больший, чем единичный круг, и с пропуском по левому краю.
Я изо всех сил пытаюсь понять, как я должен преобразовать это в stem()
графики, представленные встроенным алгоритмом DFT.
Большое спасибо, J.