Pri výpočte diskrétneho Fouriera mám problémtransformácia v MATLABe, očividne získate správny výsledok, ale pri vykreslení amplitúdy získaných frekvencií môžete vidieť hodnoty veľmi blízko k nule, ktoré by mali byť presne nula. Používam svoju vlastnú implementáciu:
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
Viem, že je lepšie použiť fft MATLABu, ale musím použiť svoju vlastnú implementáciu, ako je to pre vysokú školu.
Kód, ktorý som použil na vytvorenie štvorcovej vlny:
x = [ones(1,8), -ones(1,8)];
for i=1:63
x = [x, ones(1,8), -ones(1,8)];
end
MATLAB verzia: R2013a (8.1.0.604) 64 bitov
Skúšal som všetko, čo sa mi stalo, ale s používaním MATLABu nemám veľa skúseností a na fóre som nenašiel informácie relevantné pre túto tému. Dúfam, že mi niekto môže pomôcť.
Vopred ďakujem.
odpovede:
0 pre odpoveď č. 1Bude to číselný problém. Hodnoty sú v rozsahu 1e-15
, zatiaľ čo DFT vášho signálu má hodnoty v rozsahu 1e+02
, S najväčšou pravdepodobnosťou to nepovedie k žiadnym chybám pri ďalšom spracovaní. Môžete spočítať celkovú chybu štvorcovú medzi vašim DFT a MATLABom. fft
funkciu
y = fft(x);
yh = Discrete_Fourier_Transform(x);
sum(abs(yh - y).^2)
ans =
3.1327e-20
čo je v podstate nula. Preto by som dospela k záveru: vaša funkcia DFT funguje dobre.
Len jedna malá poznámka: DFT môžete ľahko vektorizovať.
n = 0:1:N-1;
k = 0:1:N-1;
y = exp(-1j*2*pi/N * n"*k) * x(:);
s n"*k
vytvoríte maticu so všetkými kombináciami n
a k
, Potom si vezmite exp(...)
každého z týchto prvkov matice. s x(:)
uistíš sa x
je vektor stĺpca, takže môžete vykonať násobenie matíc (...)*x
čo automaticky predstavuje súčet všetkých k
Vlastne si len všimnem, že toto je presne známa maticová forma DFT.