Sida 1 av 1
Fourietransformerad signal i matlab
Postat: 10 oktober 2012, 14:32:09
av hento
Har precis fourietransformerat ett stycke klassisk musik och plottat det på en axel med samma längd som fourietransformens vektor. Enligt tidigare uppgifter skall ju toppar visas vid de mest påtagliga frekvenserna i signalen men enligt plotten nu så får jag endast toppar i början och slutet av x-axeln och den ser helt symmetrisk ut.
Hur ska jag tolka detta och vad är det jag missförstår?
Re: Fourietransformerad signal i matlab
Postat: 10 oktober 2012, 14:50:54
av psynoise
Har du verkligen använt fourietransform (FT)? I Matlab är det betydligt enklare att använda någon tiddiskret transform istället som till exempel diskret fouriertransform (DFT).
Iaf beskrivningen av din graf påminner om vikningsdistorsion. Nu var det ett bra tag sedan jag håll på med liknande. Men bifoga grafen och koden direkt här på forumet så kan vi se exakt vad du gjort.
Re: Fourietransformerad signal i matlab
Postat: 10 oktober 2012, 15:41:09
av hcb
Har du viktat dina indata med någon viktningsfunktion?
Re: Fourietransformerad signal i matlab
Postat: 10 oktober 2012, 16:25:02
av hatten
Det FFT-algoritmen spottar ur sig är alltid symmetriskt runt Nyquistfrekvensen (halva samplingsfrekvensen fs). Hälften av datat är alltså rent redundant och kan tas bort i plotten.
Om du plottar första halvan av datamängden, samt därefter skalar om x-axeln till 0 ... fs/2 så blir det mer lättolkat! Se exemplet i dokumentationen;
doc fft eller
http://www.mathworks.se/help/matlab/ref/fft.html
Vill man vara mer formell och plotta från -fs/2 till fs/2 så finns funktionen
fftshift. Men notera, igen, att ena halvan är en ren spegling av den andra.
Re: Fourietransformerad signal i matlab
Postat: 10 oktober 2012, 17:15:16
av LHelge
Kod: Markera allt
fs = 44000;
ts = 1/fs;
t = 0:ts:10;
N2 = floor(length(t)/2);
x = sin(440 * t * 2*pi);
f = fft(x);
plot(linspace(0, fs/2, N2), abs(f(1:N2)));
Skapar en 440 Hz sinus samplad med 44000 Hz och plottar den i frekvensdomänen.
Re: Fourietransformerad signal i matlab
Postat: 16 oktober 2012, 10:16:13
av psynoise
hento:
Vad kom du fram till?
Re: Fourietransformerad signal i matlab
Postat: 16 oktober 2012, 16:37:35
av guckrum
Ett sätt att titta på en ljudsignals frekvensinnehåll är att titta på dess
energispektrum. Det gör man genom att plotta kvadraten av
absolutbeloppet av den diskreta Fouriertransformen av signalen.
Ofta är det lämpligt att logaritmera också, dvs att ta tex
10*log10( abs(fft(x)).^2 ), eller, ekvivalent 20*log10( abs( fft(x) ) ).
Detta för att energin är amplituden i kvadrat, och amplituden är
absolutbeloppet av (den komplexvärda) signalen. 10*log10() gör att
det blir uttryckt i deciBel. Just logaritmeringen gör att det blir lättare
att se.
Notera att en Fouriertransform generellt har komplexvärd insignal och
komplexvärd utsignal. Med reelvärd insignal blir utsignalen "symmetrisk"
och komplexvärd. Hälften av utsignalen finns representerad i den andra
hälften och är helt redundant.
Om man vill analysera ett helt musikstycke bryter man lämpligen ner
signalen i kortare bitar, fönstrar dem och Fouriertransformerar var för sig.
Det är ju just en inverterbar linjär transform, och i det diskreta fallet
produceras precis lika många "bins" utsignal som "sampel" insignal.
Med en stor transform får man någon sorts "medelfrekvensspektrum"
där ljud från alla tidpunkter blandas, men med fönstringen får man
upplösning både i tid och frekvens.
Re: Fourietransformerad signal i matlab
Postat: 20 oktober 2012, 16:26:24
av hento
Tack för alla svar, tror dock att jag varit lite otydlig i min frågeställning.
Anledningen till att jag fourietransformerade musikstycket var att hitta en gömd puls.
Varpå resultatet med två pikar förvirrade mig, att de blev tokigt var på grund av att svaret skulle plottas på nyqvistfrekvensen, görs inte detta får man också med speglingen.
Efter att halveringen gjorts finns bara pulsen i början kvar, vilket antagligen är den gömda pulsen.
Problemet löst.
Tack!