help-octave
[Top][All Lists]
Advanced

[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: Thu, 20 Feb 2014 09:20:00 +0100

Hi Brian,

you won again  :-)
Yeah, i prefer an even number of points on the freq vector.
Thus following your suggestion. Below is my final demo code.

Today is maybe time for a new small donation to octave proj.

Thank you very much!
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')


On 2/19/14, Brian Kaczynski <address@hidden> wrote:
> 2014-02-19 10:49 GMT+01:00, oxy <address@hidden>:
>> 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!!!!!
>
> 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
>>
>> %======== 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
>>>>>
>>>>
>>>
>>
>


reply via email to

[Prev in Thread] Current Thread [Next in Thread]