[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Any FFT expert around?
From: |
oxy |
Subject: |
Re: Any FFT expert around? |
Date: |
Wed, 19 Feb 2014 10:49:57 +0100 |
hi brian,
now it works ... great!!!!!!!
Look at the code below ajusted according to your hints.
Just one question more: you are calculating the frequency
vector as:
freq1=-linspace(-Fs1/2, Fs1/2-1/at, Fs1*at)';
that makes it non-symetric. Isn't it better ...
freq1=-linspace(-Fs1/2+1/at, Fs1/2-1/at, Fs1*at)';
...? Then it's symetric. Hey, thanks a lot! Great help!!!!!
oxy
%======== DEMONSTRATION CODE =========
% TTF Demo: this code shows how to calculate the
% frequency domain when doing FFT of td-signals.
%--- parameter setup: same signal, 2 sampling rates ---
clear all
nu=10; % signal frequency
at=5; % acquisition time
T1=2 % signal decay constant in time domain
FsFactor1=4; % sampling rate factor 1, Fs1/nu
FsFactor2=16; % sampling rate factor 2, Fs2/nu
%----------- calculating -------------------
Fs1 = FsFactor1*nu; % Sampling rate 1
Fs2 = FsFactor2*nu; % Sampling rate 2
t1 = ((0:(at*Fs1-1))/Fs1)'; % Time vector 1
t2 = ((0:(at*Fs2-1))/Fs2)'; % Time vector 2
tdsig1=exp(-i*2*pi*nu*t1).*exp(-t1./(T1)); % time domain signal 1
tdsig2=exp(-i*2*pi*nu*t2).*exp(-t2./(T1)); % time domain signal 2
% I realized, the signal was appearing negative, thus minus...
freq1=-linspace(-Fs1/2,Fs1/2-Fs1/(Fs1*at),Fs1*at)'; % freq. vector 1
freq2=-linspace(-Fs2/2,Fs2/2-Fs2/(Fs2*at),Fs2*at)'; % freq. vector 2
freqsig1=fftshift(fft(tdsig1)); % signal vector 1
freqsig2=fftshift(fft(tdsig2)); % signal vector 2
%----------- end ------------------
=================================================
On 2/19/14, oxy <address@hidden> wrote:
> On 2/12/14, Brian Kaczynski <address@hidden> wrote:
>> Hi Oxy,
>>
>> Since you're taking the FFT of a complex vector it will have unique terms
>> for negative vs. positive frequency. You are correct that it makes more
>> sense to think of the FFT from -Fs/2 to +Fs/2. It's just that the Octave
>> fft function doesn't compute the bins in that order. Due to aliasing,
>> any
>> frequency Fs/2 + df is equivalent to (-Fs/2 + df) so it's more a matter
>> of
>> choice how you want to display the data.
>>
>> If you prefer plotting from -Fs/2 to +Fs/2 I would change these two lines
>> of your code as follows:
>>
>> freq=linspace(-Fs/2,Fs/2-Fs/(Fs*at),Fs*at)'
>> freqsig=fftshift(fft(tdsig);
>>
>> Let us know if that gives you what you want!
>>
>> -Brian
>>
>>
>> 2014-02-12 17:15 GMT+01:00 oxy <address@hidden>:
>>
>>> Hi Brian,
>>>
>>> > The frequency vector for FFT should go from DC as bin 1 to slightly
>>> > less
>>> > than Fs in the last bin (Fs - Fs/N where N is the number of FFT
>>> > points).
>>>
>>> If i understand u correctly, the frequency vector (freq) must be written
>>> as in this modified version of code below. However, according to Nyquist
>>> we
>>> cannot measure a frequency higher than Fs/2. Thus i do not see
>>> the meaning of plotting up to ~Fs.
>>>
>>> Also, if I rerun the code below changing FsFactor, I again see this
>>> dependency of the signal frequency on FsFactor.
>>> I cannot understand it. Looks like basics, yet not that obvious.
>>>
>>> #---------- start code ------------
>>> clear all
>>> nu=10; % signal frequency
>>> at=5; % acquisition time
>>> T1=2 % signal decay constant in time domain
>>> FsFactor=16; % the ratio (sampling rate)/(signal
>>> frequency), or Fs/nu
>>>
>>> clf
>>> Fs = FsFactor*nu; % Sampling rate
>>> t = ((0:(at*Fs-1))/Fs)'; % Time vector
>>> % freq=linspace(-1,1,Fs*at)' * Fs/2; % frequency vector, first
>>> version
>>> freq=linspace(0,1,Fs*at)' * Fs- Fs/(Fs*at); % frequency vector
>>> suggested by Brian
>>> tdsig=exp(-i*2*pi*nu*t).*exp(-t./(T1)); % time domain signal
>>> freqsig=fft(tdsig); % freq. domain
>>> signal
>>> subplot(1,2,1)
>>> plot(t,tdsig)
>>> axis([ 0 0.4]) % zooming time domain to see that period=1/nu
>>> subplot(1,2,2)
>>> plot(freq, freqsig)
>>> #---------- end code ------------
>>>
>>> thx guys ...
>>>
>>>
>>> > 2014-02-12 14:22 GMT+01:00 oxy <address@hidden>:
>>> >
>>> >> hey guys,
>>> >>
>>> >> the (simple) code bellow is how i ve learned to do FFT according to
>>> >> several docs online. However i observe a dependency of the signal
>>> >> frequency in the spectrum on the constant FsFactor. In other words,
>>> >> the signal frequency depends on the sampling rate. I should'nt be,
>>> >> right? So what is wrong here?
>>> >>
>>> >> #---------- start code ------------
>>> >> clear all
>>> >> nu=10; % signal frequency
>>> >> at=5; % acquisition time
>>> >> T1=2 % signal decay constant in time domain
>>> >> FsFactor=8; % the ratio (sampling rate)/(signal
>>> >> frequency), or Fs/nu
>>> >>
>>> >> clf
>>> >> Fs = FsFactor*nu; % Sampling rate
>>> >> t = ((0:(at*Fs-1))/Fs)'; % Time vector
>>> >> freq=linspace(-1,1,Fs*at)' * Fs/2; % frequency vector
>>> >> tdsig=exp(-i*2*pi*nu*t).*exp(-t./(T1)); % time domain signal
>>> >> freqsig=fft(tdsig); % freq. domain
>>> >> signal
>>> >> subplot(1,2,1)
>>> >> plot(t,tdsig)
>>> >> axis([ 0 0.4]) % zooming time domain to see that period=1/nu
>>> >> subplot(1,2,2)
>>> >> plot(freq, freqsig)
>>> >> #---------- end code ------------
>>> >>
>>> >> Do it yourself. Just rerun the code trying different values of
>>> >> FsFactor (eg: 2, 4, 8).
>>> >> Thx a lot for any hint!!!
>>> >>
>>> >> oxy
>>> >>
>>> >> ps: cross post
>>> >>
>>> http://www.mathworks.com/matlabcentral/answers/115700-fft-why-signal-frequency-depends-on-sampling-rate
>>> >> _______________________________________________
>>> >> Help-octave mailing list
>>> >> address@hidden
>>> >> https://mailman.cae.wisc.edu/listinfo/help-octave
>>> >>
>>> >
>>> _______________________________________________
>>> Help-octave mailing list
>>> address@hidden
>>> https://mailman.cae.wisc.edu/listinfo/help-octave
>>>
>>
>