Ik heb problemen met het identificeren van de frequentiecomponenten van een afbeelding,
Hier heb ik simpelweg 256×256 binaire- afbeelding.
a = [zeros(256,128) ones(256,128)]; imshow(a);
De afbeelding FFT maken en verschuiven de nul-frequentie naar het midden,
f = fft2(a) shft = fftshift(f); imshow(log(shft)) %stretching
zal resulteren,
Hoe identificeer ik hoeveel frequentiecomponenten er zijn en wat zijn die frequenties?
Ook als ik de FFT van een 1-D-reeks bereken en die reeks plot, zijn er bepaalde waarden op negatief, wat betekent dat? Hoe kunnen er negatieve frequenties zijn?
Reacties
- Gerelateerd (mogelijk duplicaat): dsp. stackexchange.com/q/1637/77
- Een van de beste manieren om te begrijpen wat een transformatie doet, is door te experimenteren met de inverse transformatie. Teken een punt en transformeer het vervolgens in omgekeerde volgorde om de golven te zien die het produceert. Probeer dan een punt op een andere plaats, dan een lijn, enz. Zie voor negatieve frequenties dsp.stackexchange.com/q/431/29
Antwoord
hoe kunnen er negatieve frequenties zijn?
De FFT-coëfficiënten zijn geen frequenties, maar complexe amplitudes. De modulus van de coëfficiënt geeft de amplitude aan, het argument van de coëfficiënt geeft de fase aan.
Merk op dat je een waarschuwing of foutmelding van Matlab zou moeten krijgen voor het berekenen van log(shft)
, aangezien shft een complexe matrix is, is het resultaat niet echt en kan het niet als afbeelding worden geplot.
Opmerkingen
- Alles wat je zegt is waar, maar het is ook een omkering van de vraag. De helft van de coëfficiënten kan worden geïnterpreteerd om overeen te komen met negatieve frequenties.
Antwoord
Mijn eerste suggestie is dat u begrijp FFT in 1 dimensie voordat u de resultaten in 2D probeert te interpreteren.
De Discrete Fourier Transform (FFT is een implementatie van DFT) is een complexe transformatie: het transformeert tussen 2 vectoren complexe vectoren van grootte N.
Dus in het 1D-geval krijg je niet alleen negatieve waarden, maar complexe waarden in het algemeen.
Hetzelfde geldt voor 2D. De imshow-functie neemt waarschijnlijk het echte deel van de complexe matrix (het is niet duidelijk in de imshow-documentatie).
Answer
Je mist het abs
commando.
Probeer het volgende:
f = fft2(a) shft = fftshift(abs(f)); imshow(log(shft)) %stretching