9 svar
70 visningar
AstridG är nöjd med hjälpen
AstridG 66
Postad: 6 nov 2020 01:19 Redigerad: 6 nov 2020 01:19

Matlab Ftt och Amp spectrum

 

Hej jag ska ta fram Amplitud i spectrum med 2 sidig, jag undrar om detta är rätt svar. Infogade koden nedre bilderna.

 

[signal,fs] = audioread('Sound2.wav');
L1 = 500;
L2 = 1000;
t=linspace(0,length(signal)/fs,length(signal));
NFFT1 = 2^nextpow2(L1);
NFFT2 = 2^nextpow2(L2);

y500 = fft(signal,NFFT1);
y1000 = fft(signal,NFFT2);
ff500 = y500(1:NFFT1/2);
ff1000 = y1000(1:NFFT2/2);
fA = (fs/NFFT1)*(-NFFT1/4:NFFT1/4-1);
fB = (fs/NFFT2)*(-NFFT2/4:NFFT2/4-1);

plot(fA,abs(fftshift(ff500)))
plot(fB,abs(fftshift(ff1000)))

Teraeagle 20234 – Moderator
Postad: 6 nov 2020 08:34

Tips! Notera att det finns stöd för Matlab-kod i forumet om du trycker på {;} i verktygsfältet där du skriver ditt inlägg.

[signal,fs] = audioread('Sound2.wav');
L1 = 500;
L2 = 1000;
t=linspace(0,length(signal)/fs,length(signal));
NFFT1 = 2^nextpow2(L1);
NFFT2 = 2^nextpow2(L2);
y500 = fft(signal,NFFT1);
y1000 = fft(signal,NFFT2);
ff500 = y500(1:NFFT1/2);
ff1000 = y1000(1:NFFT2/2);
fA = (fs/NFFT1)*(-NFFT1/4:NFFT1/4-1);
fB = (fs/NFFT2)*(-NFFT2/4:NFFT2/4-1);

plot(fA,abs(fftshift(ff500)))
plot(fB,abs(fftshift(ff1000)))
Dr. G 9362
Postad: 6 nov 2020 09:00

Jag antar att din signal är reell (konstigt ljud annars). 

Du kan då slänga bort negativa frekvenser i din FFT, då de inte tillför någon extra information. Du gör detta när du skapar fft500:

y500 = fft(signal,NFFT1);
ff500 = y500(1:NFFT1/2);

Att göra detta och att använda fftshift() blir inte rätt. Du behöver inte fftshift() när de negativa frekvenserna är borta. 

Vill du att fA och fB ska ha negativa värden?

AstridG 66
Postad: 6 nov 2020 10:58 Redigerad: 6 nov 2020 11:09
Dr. G skrev:

Jag antar att din signal är reell (konstigt ljud annars). 

Du kan då slänga bort negativa frekvenser i din FFT, då de inte tillför någon extra information. Du gör detta när du skapar fft500:

y500 = fft(signal,NFFT1);
ff500 = y500(1:NFFT1/2);

Att göra detta och att använda fftshift() blir inte rätt. Du behöver inte fftshift() när de negativa frekvenserna är borta. 

Vill du att fA och fB ska ha negativa värden?

Ska prov köra snart, enligt uppgiften så får man välja antingen 1 sidig eller 2sidig, signalen är från en inspelning av vattnet som faller kanske en kanal. Så den har mkt olika frekvensener. Man behöver inta ha negativa värde på fA och fB. Jag gjorde shift fft för peaken hamnar längst till noll att de blir en rakt sträck på y-axel 

Jag har inte ändrat fA, men vill visa exempel när jag tar bort shift ftt.

Dr. G 9362
Postad: 6 nov 2020 12:08

Om du tar bort alla negativa frekvenser så blir det knas med fftshift().

Prova

fA = (fs/NFFT1)*(0:NFFT1/2-1);

och inget fftshift().

Annars kan du ha kvar de negativa frekvenserna, köra med

fA = (fs/NFFT1)*(-NFFT1/2:NFFT1/2-1);

Och sedan använda fftshift().

AstridG 66
Postad: 6 nov 2020 12:22
Dr. G skrev:

Om du tar bort alla negativa frekvenser så blir det knas med fftshift().

Prova

fA = (fs/NFFT1)*(0:NFFT1/2-1);

och inget fftshift().

Annars kan du ha kvar de negativa frekvenserna, köra med

fA = (fs/NFFT1)*(-NFFT1/2:NFFT1/2-1);

Och sedan använda fftshift().

typ så här.

Dr. G 9362
Postad: 6 nov 2020 14:04

Det där ovan skulle kunna vara vad du vill visa. Vet du vad du har för enheter?

AstridG 66
Postad: 6 nov 2020 14:42
Dr. G skrev:

Det där ovan skulle kunna vara vad du vill visa. Vet du vad du har för enheter?

frekvens i x-axlar och amplituden på y-axel, jag borde snygga till det. De som jag inte förstår varför bli det en hög peak på nollställe men sen hela vägen är avtagit. Har de nånting göra med desto högre frekvens sen försvinner det? från audio så har sampling frekvens på 32000 och NFFT man använder bara 512 och 1024 som man får från nextpow2. Är de orsaken de blir så här, på grund de för stora skillnad med väder? Skulle man använda en sinus funktion med givna tal skulle man få en bättre resultat vad jag vet. 

Dr. G 9362
Postad: 6 nov 2020 15:31

Verkar det rimligt med en topp vid 2 kHz?

Vad är det för ljud som har spelats in?

Frevkenskomponenten vid 0 Hz (DC-termen) är signalens tidsmedelvärde. Prova att dra bort mean(signal) före fft() så ser du att den blir 0. 

AstridG 66
Postad: 6 nov 2020 15:38
Dr. G skrev:

Verkar det rimligt med en topp vid 2 kHz?

Vad är det för ljud som har spelats in?

Frevkenskomponenten vid 0 Hz (DC-termen) är signalens tidsmedelvärde. Prova att dra bort mean(signal) före fft() så ser du att den blir 0. 

Låter som en liten flod så de mkt olika ljud.

Svara Avbryt
Close