[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: |
Fri, 14 Mar 2014 09:57:44 +0100 |
Hi Brian,
>> point k, frequency
>> point 1: 0 * 0.36364 = 0.00000
>> point 2: 1 * 0.36364 = 0.36364
>> point 2: 2 * 0.36364 = 0.72727
>> ...
>> point 6: 5 * 0.36364 = 1.81818
>> point 7: -1 * 0.36364 = -0.36364
>> point 8: -2 * 0.36364 = -0.72727
>> ...
>> point 11: -5 * 0.36364 = -1.81818
>
> Points 1-6 are correct but 7-11 are backwards. Point 7 should be -5 *
> 0.36364 and point 11 should be -1 * 0.36364.
>
> Let's say you place the original points in order as follows:
> [1 2 3 4 5 6 7 8 9 10 11]
> When you do fftshift() on the fft output, the points get rearranged as
> follows:
> [7 8 9 10 11 1 2 3 4 5 6]
> I hope this makes sense!
Yes that makes a lot of sense!
It was actually straight forward to deduce from you previous email.
And I did not pay attention on that.
Thank you a lot for your very precise answers!
A precious email correspondent!
All the best ...
>> On 3/13/14, oxy <address@hidden> wrote:
>> > Hi Brian,
>> >
>> >> freq=linspace(-Fs1*(N-1)/(2*N), Fs1*(N-1)/(2*N), Fs1*at)';
>> >
>> > ok, i will rewrite it with an example:
>> >
>> > If i sample 11 points (N=11) at the rate Fs=4 and fft it,
>> > my first point on the frequency vector will be zero.
>> > The next will be df=Fs/N=0.36364.
>> > The 3rd will be 2*df=Fs/N=0.72727
>> > ...
>> > ...
>> >
>> > In other words:
>> >
>> > point k, frequency
>> > point 1: 0 * 0.36364 = 0.00000
>> > point 2: 1 * 0.36364 = 0.36364
>> > point 2: 2 * 0.36364 = 0.72727
>> > ...
>> > point 6: 5 * 0.36364 = 1.81818
>> > point 7: -1 * 0.36364 = -0.36364
>> > point 8: -2 * 0.36364 = -0.72727
>> > ...
>> > point 11: -5 * 0.36364 = -1.81818
>> >
>> >
>> > Again in other words, here is the code:
>> >
>> >
>> > Fs=4 % sampling rate
>> > N=11 % nr. of points
>> > df=Fs/N % freq. increment per point
>> > MaxFreq=df*(N-1)/2 % max measurable freq
>> > freqIdx=[(0:N/2)'; -(1:N/2)'] % index vector to get the freqs
>> > freq=freqIdx*df; % frequency vector
>> > [freqIdx freq] % index beside frequency
>> > fftshift(freq) % shifted freq vector
>> >
>> >
>> > Thanks very much again for your very helpful wisdom!!!
>> > All the best ...
>> >
>> >
>> >> 2014-03-12 11:45 GMT+01:00 oxy <address@hidden>:
>> >>
>> >>> hi all,
>> >>>
>> >>> again in the question about FFT frequency axis.
>> >>>
>> >>> Pls confirm if I'm doing it right here:
>> >>>
>> >>> If I do fftshift(fft(time_domain_signal))
>> >>> of a certain time_domain_signal with even number of points,
>> >>> then the frequency axis becomes
>> >>>
>> >>> freq=linspace(-Fs1/2, Fs1/2-Fs1/(Fs1*at), Fs1*at)';
>> >>>
>> >>> where Fs= sampling rate, at=acquisition time.
>> >>>
>> >>> If however my time domain signal has an odd number of points, then
>> >>>
>> >>> freq=linspace(-Fs1/2, Fs1/2, Fs1*at)';
>> >>>
>> >>> Am id doing it right?
>> >>>
>> >>> We had a recent thread on that. See some msg below.
>> >>>
>> >>> Thx for your wisdom!
>> >>>
>> >>> oxy
>> >>>
>> >>>
>> >>> > % 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
>> >>> >
>> >>> >
>> >>> > %----------- ploting -------------------
>> >>> > clf
>> >>> > subplot(1,2,1)
>> >>> > plot(freq1, freqsig1)
>> >>> > axis([-20 0]), title('FsFactor=4')
>> >>> >
>> >>> > subplot(1,2,2)
>> >>> > plot(freq2, freqsig2)
>> >>> > axis([-20 0]), title('FsFactor=16')
>> >>> > % --------- end ---------------------------
>> >>> >
>> >>> >>>================================================
>> >>> >>> 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!!!!!
>> >>> >>
>> >>> >> That would be "better" if you really want to insist on having a
>> >>> >> symmetrical frequency vector at the expense of accuracy.
>> >>> >> Unfortunately, it's inaccurate. For one thing, your symmetrical
>> >>> >> frequency vector does not contain a DC term if you have an even
>> >>> >> number
>> >>> >> of FFT points (which you should based on your examples).
>> >>> >>
>> >>> >> If you want the FFT value at the nth point to really correspond to
>> >>> >> freq1(n) you should use the slightly offset frequency vector that
>> >>> >> I
>> >>> >> provided.
>> >>> >>
>> >>> >> If it is more important to whatever you're doing that the
>> >>> >> frequency
>> >>> >> vector be exactly symmetrical and you can live with sacrificing
>> >>> >> the
>> >>> >> true 1-to-1 correspondence between frequency points and FFT
>> >>> >> points,
>> >>> >> you can use your symmetrical frequency vector.
>> >>> >>
>> >>> >>> oxy
>> >>> >>>
>> >>> >>> =================================================
>> >>> >>> 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
>> >>> >>>>>>
>> >>> >>>>>
>> >>> >>>>
>> >>> >>>
>> >>> >>
>> >>> >
>> >>>
>> >>
>> >
>> _______________________________________________
>> Help-octave mailing list
>> address@hidden
>> https://mailman.cae.wisc.edu/listinfo/help-octave
>>
>