How to correctly make FFT of sound set?
    9 Ansichten (letzte 30 Tage)
  
       Ältere Kommentare anzeigen
    
    Igor
      
 am 14 Jun. 2011
  
    
    
    
    
    Kommentiert: Danilo Persico
 am 9 Jul. 2021
            During 7 sec 7 tones plays with frequences (all in Hz), one tone -- one sec. Code:
    Fs=44100;f=[261.63 293.67 329.63 349.23 392.00 440 493.88];
    duration=7;octava=2;f=f/octava;Df=duration*Fs;FF=2*pi/Fs*f;
len = length(f);tau=Df/len;
    n=1:Df;y=zeros(1,Df);
    for i = 1:len
      amplitude=(n>(i-1)*tau)&(n<i*tau);
      y = y + sin(FF(i)*n).*amplitude;
    end
  soundsc(y, Fs);
This question rather for mathematicians. Now I have to see Fourier tranformation. Perhaps it will not accurate vertical Dirac bars but what?
Code:
Y1=fft(y);plot(abs(Y1))
Two bar on edges? How to make beauty picture? And what frequencies will be?
0 Kommentare
Akzeptierte Antwort
  Rick Rosson
    
 am 17 Jun. 2011
        Maybe this will help:
%%Parameters:
playAudio = false;
%%Time domain:
Fs = 44100;
dt = 1/Fs;
StartTime = 0;
StopTime = 1;
t = (StartTime:dt:StopTime-dt)';
%%Cosine waves:
Fc = [261.63 293.67 329.63 349.23 392.00 440 493.88];
y = cos(2*pi*t*Fc);
N = size(y,2);
%%Reshape signal to a single column vector:
y = y(:);
%%Reformulate time domain:
StopTime = N*StopTime;
t = (StartTime:dt:StopTime-dt)';
M = size(t,1);
%%Frequency domain:
dF = Fs/M;
f = -Fs/2:dF:Fs/2-dF;
Y = (N/M)*fftshift(fft(y));
%%Play the music:
if playAudio
   sound(y,Fs);
end
%%Plot time domain:
figure;
plot(t,y);
%%Plot frequency domain:
figure;
plot(f,abs(Y));
HTH.
Rick
4 Kommentare
  Rick Rosson
    
 am 17 Jun. 2011
				Also, there are a few things about this script that are not quite optimal. Can you figure out what they are and how to fix them?
  Danilo Persico
 am 9 Jul. 2021
				Hello Mr. Rosson, I would like if you could give an explaination of the code, thank you!
Weitere Antworten (2)
  Daniel Shub
      
      
 am 15 Jun. 2011
        The fft assumes that the signal is cyclical. You need to match up your edges (or zero pad) to get delta functions. The fft also returns both positive and negative frequencies. I would read the documentation about fft and fftshift.
0 Kommentare
  Rick Rosson
    
 am 16 Jun. 2011
        Please try the following:
dt = 1/Fs;
len = duration*Fs;
n = dt*(0:len-1);
Df = Fs/len;
f = -Fs/2:Df:Fs/2-Df;
Also:
Y1 = fftshift(fft(y));
plot(abs(Y1));
HTH.
Siehe auch
Kategorien
				Mehr zu Spectral Measurements finden Sie in Help Center und File Exchange
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!



