Yritän ottaa siniaallon näytteen ja piirtää sen taajuuskomponentit, mutta minulla on vaikeuksia sen toteuttamisessa Tulos 65536 näytteen ottamisesta yhdestä siniaaltojaksosta, jonka suurin amplitudi on 1 ja taajuus 100, voidaan nähdä alla. Jos Y-akseli on tämä kompleksisen Fourier-summan suuruus ja x-akseli on näytteen numero Kuinka voin nähdä, kuinka usein siniaallolla on tältä käyrältä? Haluaisin, että minulla olisi käyrä taajuus vs. suuruus eikä näytteen määrä vs. suuruus.
Odotin yhtä suurta amplitudin piikkiä 1 tai kaksi piikkiä, joista kukin on amplitudi 0,5, mutta minusta näyttää olevan tulossa suuri amplitudi, en tiedä mitä voin tehdä väärin.
Matlab-koodi:
Amp = 1; freq = 100; dt = 2 * pi /65536; index = 1; for t = 0:dt:2*pi sine(index) = Amp * sin(2*pi*freq*t); sampleNumber(index) = index; index = index + 1; end transform = fft(sine); magTransform = abs(transform); plot(sampleNumber,magTransform);
kommentit
- FFT-toteutusten vahvistus on usein suhteessa dollariin $ N $ tai $ \ sqrt {N} $. Tuloksesi ei ole ' kohtuuton.
- Jakamalla suuruus $ N $: lla saadaan kaksi piikkiä, joiden suuruus on noin 0,425 (joka on edelleen pienempi kuin odotettu 0,5 Kuinka x-akseli muutetaan taajuudeksi näytteen numerosta?
Vastaa
Näyttää siltä kuin sinä sekoitat taajuutesi Hertzissä sekoitettuna radiaaneina sekunnissa, koska kerroin $ 2 \ pi $ molemmilla näytteenottojaksoilla dt ja signaalisi. Kirjoitin osan koodistasi selventääksesi mielestäni todella haluamaasi.
Amp = 1; freqHz = 12000; fsHz = 65536; dt = 1/fsHz; t = 0:dt:1-dt; sine = Amp * sin(2*pi*freqHz*t); N = 65536; transform = fft(sine,N)/N; magTransform = abs(transform); faxis = linspace(-fsHz/2,fsHz/2,N); plot(faxis/1000,fftshift(magTransform)); axis([-40 40 0 0.6]) xlabel("Frequency (KHz)")
Jos näytteenottotaajuutesi on 65536 näytettä / sekunti , ja haluat esimerkiksi 12 KHz: n äänen, voit luoda sen kuvan osoittamalla tavalla. Tässä esimerkkijaksosi on 1/65536 sekuntia.
Odotuksesi saada kaksi piikkiä, joiden amplitudi on 0,5, oli oikein – vain luomasi sävy ei ollut.
Luo vektori luomalla x-akselin skaalaus Hertziin. samalla pisteiden määrällä kuin FFT-tulos ja lineaarisella lisäyksellä $ – fs / 2 $ – $ + fs / 2 $ . Huomaa myös fftshift, jota käytin juonessa. Tämä johtuu siitä, että Matlabin FFT-funktion tulos menee lineaarisesti 0: sta fs: ään. Minusta on helpompaa visualisoida, että DC on keskitetty, mutta kumpi tahansa on kunnossa. Ilman fftshift-vektoria faxis siirtyisi 0: sta arvoon fs .
vastaus
Jotkut FFT: t vaativat jakamista 1 / N: llä edustamaan suuruutta ”luonnollisesti” (mikä ei säästää energiaa) ). X-akselin merkitseminen edellyttää näytetaajuuden (Fs) tuntemista. Jos tiedetään, niin f_x = bin_index * Fs / N, enintään N / 2, sitten peilattu negatiivisille taajuuksille. Jos spektripiikin (syötetyn siniaallon) taajuus ei ole ”t tarkalleen jaksoittainen FFT-pituudessa (esim. Kokonaisluku) sykliä), niin lähimmän FFT-tulostelokeron suuruus on pienempi, ja sinun on interpoloitava roskakorien välillä, jotta löydetään tarkempi arvio huipun suuruudelle (paraboliset tai ikkuna-Sinc-ytimen interpolaatiot ovat yleisiä).
vastaus
Som-kaavojen lisääminen hotpaw2-vastaukseen:
FFT: llä lasket signaalin esityksen kuten
$$ x (t) = \ sum_ {k = 0} ^ {N-1} \ hat x_k e ^ {2 \ pi i \, f_k \, t} $$
missä $ f_k = \ frac {k} {N} f_s $ hintaan $ k = 0,1, …, N / 2-1 $ ja $ f_k = \ frac {kN} {N} f_s $ for $ k = N / 2, …, N-1 $, olettaen, että $ N $ on tasainen.
Nyt FFT edellyttää, että näytteet otetaan näytteenottovaiheella $ \ tau = 1 / f_s $ , $ x_n = x (n \ tau) $, ja malliryhmän $ (x_n) _n $ FFT antaa skaalatun amplitudiryhmän $ (N \ hat x_k) _k $, koska $ \ sum_ {k = 0} ^ {N-1} 1 = N $. Uudelleen skaalattava i Ne jätetään yleensä FFT-toteutusten ulkopuolelle, joita FFT-kirjaston käyttäjän on käsiteltävä.
Answer
FFT tarjoaa menetelmän DFT: n laskemisesta, jonka tiedät jo. Tarkastellaan nyt signaalia x (n) ja sen DFT X (k): tä. jos signaalisi koostuu N (tapauksessasi 65536) näytteestä, X (k) antaa arvot erillisillä taajuuksilla 2*pi*k/N
. Itse asiassa yllä oleva DFT X (k) tarkoittaa X(2*pi*k/N)
. joten jos löydät X (1): n, se tarkoittaa, että löydät DFT-kertoimen erillisellä taajuudella 2 * pi * 1 / N ja vastaavalla tavalla, X (2) tarkoittaa kerrointa arvolle 2 * pi * 2 / N ja siten niin edelleen. Jokainen kerroin osoittaa kyseisen taajuuden vaikutuksen kyseiseen signaaliin, jos sen suuri arvo tarkoittaa, että taajuus muodostaa suurimman osan signaalista. Joten taajuuden suhteen fft: n piirtämistä varten vaihda näyte-akseli taajuusakselille, jonka pisteet ovat 2*pi*k/N
, jossa k = 0 – 65535.FT ei koskaan anna mitään aikaa koskevaa tietoa. se antaa vain signaali.