[SciPy-User] frequency components of a signal buried in a noisy time domain signal

Anne Archibald peridot.faceted@gmail....
Fri Feb 26 15:32:01 CST 2010


Hi,

Looking at a periodic signal buried in noise is a well-studied
problem, with many techniques for attacking it. You really need to be
a little more specific about what you want to do. For example, is your
input signal really a sinusoid, or does it have harmonic content? Are
you trying to detect a weak periodic signal or are you trying to
extract the features of a strong periodic signal? Is your signal
exactly periodic, does it have some (deterministic or random) wander,
or are you looking for the power spectrum of a broadband signal?

If your input data are non-uniformly sampled, everything becomes more
difficult (and computationally expensive), but there are solutions
(e.g. the Lomb-Scargle periodogram).

Anne

On 26 February 2010 16:24, Nils Wagner <nwagner@iam.uni-stuttgart.de> wrote:
> On Fri, 26 Feb 2010 15:56:29 -0500
>  Ivo Maljevic <ivo.maljevic@gmail.com> wrote:
>> Nils,
>> Yes, FFT can be used to visualize the frequency content
>>of a signal buried
>> in the noise, especially if it is is narrowband,
>> even though more advanced spectral analysis is required
>>for advanced
>> applications.
>
> Thank you very much for your reply.
>
> Are you aware of free software for advanced applications ?
> What could be done in case of broadband noise ?
>
>
> Nils
>
>>
>> I cannot help you with non-uniformly spaced samples
>>(some sort of
>> interpolation comes to mind), but next power of 2 should
>>be trivial. Without
>> checking for the argument type, you can implement the
>>function like this:
>>
>> def nextpow2(n):
>>    m_f = np.log2(n)
>>    m_i = np.ceil(m_f)
>>    return 2**m_i
>>
>>
>> Hope it helps,
>> Ivo
>>
>> On 26 February 2010 14:05, Nils Wagner
>><nwagner@iam.uni-stuttgart.de> wrote:
>>
>>> Hi all,
>>>
>>> A common use of Fourier transforms is to find the
>>> frequency components of a signal buried in a noisy time
>>> domain signal.
>>>
>>> I found a Matlab template at
>>>
>>> http://www.mathworks.com/access/helpdesk/help/techdoc/ref/fft.shtml
>>>
>>> Matlab has a function
>>>
>>> nextpow2(L)
>>>
>>> Is there a similar build-in function in numpy/scipy ?
>>>
>>> I tried to convert the m-file into a pythonic form.
>>> What is needed to obtain a similar figure of the
>>> single-sided amplitude spectrum using
>>> numpy/scipy/matplotlib ?
>>>
>>>
>>> from numpy import sin, linspace, pi
>>> from numpy.random import randn
>>> from pylab import plot, show, title, xlabel, ylabel
>>> from scipy.fft import fft
>>>
>>> Fs = 1000. #                          Sampling frequency
>>> T  = 1./Fs #                          Sample time
>>> L  = 1000  #                          length of signal
>>> t  = arange(0,L)*T
>>> x  = 0.7*sin(2*pi*50*t)+sin(2*pi*120*t)
>>> y  = x + 2*randn(len(t))
>>> plot(Fs*t[:50],y[:50])
>>> title('Signal corrupted with zero-mean random noise')
>>> xlabel('Time (milliseconds)')
>>> #
>>> #
>>> #
>>> #NFFT = 2^nextpow2(L); # Next power of 2 from length of
>>>y
>>>
>>> Y = fft(y,NFFT)/L
>>> f = Fs/2*linspace(0,1,NFFT/2+1)
>>> plot(f,2*abs(Y[:NFFT/2+1]))
>>> title('Single-sided amplitude spectrum of y(t)')
>>> xlabel('Frequency (Hz)')
>>> ylabel('|Y(f)|')
>>> show()
>>>
>>>
>>> What can be done in case of nonequispaced data ?
>>>
>>> http://dx.doi.org/10.1137/0914081
>>>
>>> Thanks in advance
>>>
>>>                     Nils
>>> _______________________________________________
>>> SciPy-User mailing list
>>> SciPy-User@scipy.org
>>> http://mail.scipy.org/mailman/listinfo/scipy-user
>>>
> _______________________________________________
> SciPy-User mailing list
> SciPy-User@scipy.org
> http://mail.scipy.org/mailman/listinfo/scipy-user
>


More information about the SciPy-User mailing list