Fourietransformerad signal i matlab
Fourietransformerad signal i matlab
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?
Hur ska jag tolka detta och vad är det jag missförstår?
Re: Fourietransformerad signal i matlab
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.
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.
- hcb
- Moderator
- Inlägg: 5991
- Blev medlem: 23 februari 2007, 21:44:50
- Skype: hcbecker
- Ort: Lystrup / Uppsala
- Kontakt:
Re: Fourietransformerad signal i matlab
Har du viktat dina indata med någon viktningsfunktion?
Re: Fourietransformerad signal i matlab
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.
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
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)));
Re: Fourietransformerad signal i matlab
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.
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
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!
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!