/ Neočakávaný výsledok s DFT v MATLAB - matlab, dft

Neočakávaný výsledok s DFT v MATLAB - matlab, dft

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ď č. 1

Bude 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 kVlastne si len všimnem, že toto je presne známa maticová forma DFT.