Sida 1 av 1

FFT förskjuter frekvenser?

Postat: 4 maj 2007, 09:42:42
av mmbop
Jag har en fråga angående FFT i matlab. Om jag gör en FFT på ett litet antal perioder av en signal så förskjuts alla frekvenser uppåt...en frekvens som ska vara 0.3Hz blir 0.5Hz o.s.v ju fler perioder man använder för FFT:n desto mindre förskjutna blir frekvenserna tills man tillslut når det verkliga värdet...har ni någon aning om vad detta beror på?? är det avrundningar i matlab eller begränsningar i FFT algoritmen eller vad?

Förskjutningen verkar ha ett exponentiellt beroende på antalet perioder som används

Postat: 4 maj 2007, 10:03:48
av Pean
Det låter konstigt det har det int gjort för mej någon gång... men vet att var bått na bör tänka på när det gäller antalet punkter när man leker med fft.... kan leta upp föreläsningsanteckningar om det...Hur har du skrivit koden då?

Postat: 4 maj 2007, 10:08:37
av Pean
i mina böcker står det att man behöver normera fft:en eftersom fft inte ger en normerad vektor.... tror det e där ditt problem ligger :)

Postat: 4 maj 2007, 10:09:03
av Radiohead
Fullt möjligt. En signal är ALLTID oändlig. Matar du in ett kort stycke så matar du också in oändligt mycket nollnivå. Alltså, säg att du har en signal mellan 0 och 5. En fin sinuskurva. Signalen tolkas dock som att den börjar i -inf och slutar i +inf. För att transformen ska stämma så måste en massa andra frekvenser inkluderas som släcker ut signalen utanför området mellan 0 och 5. Att den frekvens som du tycker det 'är uppenbart att signalen borde inhålla också finns där är inte säkert.

Postat: 4 maj 2007, 10:18:48
av mmbop
jag förtydligar lite: jag har en signal som jag samplar med en samp. frekvens på 1Khz under 1 minut, vilket alltså ger en signal på 60000 sampel


Och koden i Matlab är endast plot(abs(fft(signalen(1:10000)))) vid FFT av 10 sekunder signal och plot(abs(fft(signalen(1:60000)))) om jag vill göra FFT av hela minuten
det ska tillägas att plot(abs(fft(signalen(20001:30000)))) ger samma frekvenser som den första så det har inget att göra med vilket 10 sekunders intervall jag tittar på

Och vid den första är alltså alla frekvenser förskjutna uppåt medan helminutaren visar bättre värde

Radiohead jag förstår inte exakt hur du menar, går det att ge några konkreta exempel på hur jag löser det?

Postat: 4 maj 2007, 10:30:20
av Pean
jag hittade en gammal tutorial

• S = fft(s,128); % 128 point Fast Fourier Transform
• P = S.*conj(S); % ‘‘Spectrum’’. Symbol .* means element-wise

• f = (0:127)/128; % Normalized frequency axis
• plot(f,P);
• plot(f/T,P); % Versus frequency in Hz

där normerar de frkvensen mellan 0och1 och sedan tar de och diviidera med samplingstiden för att få svaret i hertz.... detta för jag tror att fft vill ha in normaliserad vektor, matlab brykar vilja ha det...

Postat: 4 maj 2007, 10:41:51
av Millox
Att signalen inte är normerad spelar ingen roll, det ändrar bara amplituden. Problemet ligger sannolikt snarare i vad du mätt.

Har du mätt med exakt 1000 Hz, under exakt 10 sekunder borde du få en upplösning på 0.1 Hz och en maximal frekvens på +-500 Hz. Inget ändrar på det, så antingen har du fel på indata eller så gör du något annat fel. Exempelvis kan det bli knepigt om du inte har exakt "rätt" frekvens på indata. Då kryper det upp eller ner i frekvens beroende på upplösning.

FFT:n i matlab använder man fö såhär:

y = fft(signalen(startsampel:end),antal sampels)./(length(signalen(startsampel:end)) .* 2)

fft_resultat = y(floor(length(signalen(startsampel:end))./2+1):end)

Pean:
Den där tutorialen blir fel. Du kommer få frekvenser mellan 0 och 128 .* fs, men fft-utsignalen är från -halva frekvensen till + halva frekvensen

Postat: 4 maj 2007, 10:43:59
av mmbop
ja alltså förlåt det är inte att få ut frekvens på x-axeln som är problemet, normerar gör jag redan jag tog inte med det nu i koden för att det skulle bli mer lättläst...problemet är att oavsett vilka värden jag har på x-axeln så förskjuts frekvenserna när jag använder få perioder

Postat: 4 maj 2007, 10:55:25
av Pean
Nu vet jag inte om detta hjälper fft() ska ha in en vektor med jämn 2-potens för att funka... men funktionen inte ens går att köra om den inte får det.... börja tro att det inte är fft funktionen som e fel... ta o rita upp en lätt sinus funktion och se om den får den rätt... då kan man ju utesluta fft:n och plotten om det skulle bli rätt...

kanske är din dataskärm som har förskjutna pixlar :D

Postat: 4 maj 2007, 11:37:10
av oJsan
hmm... Du säger att förväntad frekvens är 0.3Hz. Under de tio första sekunderna som du mäter så borde du alltså ha fått in tre pulser från ditt mätobjekt.... eller två.. eller fyra... beroende på jitter. Detta kommer att påverka fft:n avsevärt.
Två pulser => 0.2Hz
Tre pulser => 0.3Hz
Fyra pulser => 0.4Hz
...hmm... men hur kan du få 0.5Hz?! Min teori haltar på den punkten, men i övrigt så stämmer det nog om dina pulser är 'korta' spikar. Vad är det för mätobjekt och hur ser utsignalen ut... plotta eller lägg upp rådata så andra kan prova i Matlab.

Postat: 4 maj 2007, 11:41:50
av mmbop
sweclockers användare är tydligen de smartaste =)

nämen tack för all hjälp!

http://www.sweclockers.com/forum/showth ... ost7334777