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)))
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)))
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?
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.
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().
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.
Det där ovan skulle kunna vara vad du vill visa. Vet du vad du har för enheter?
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.
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.
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.