[SciPy-user] Frequency content of a transient signal
Nils Wagner
nwagner at iam.uni-stuttgart.de
Tue Jul 22 04:52:31 EDT 2008
On Tue, 22 Jul 2008 09:59:13 +0200
"Matthieu Brucher" <matthieu.brucher at gmail.com> wrote:
> 2008/7/22 Nils Wagner <nwagner at iam.uni-stuttgart.de>:
>> On Tue, 22 Jul 2008 09:15:11 +0200
>> "Matthieu Brucher" <matthieu.brucher at gmail.com> wrote:
>>>
>>> Hi !
>>>
>>> I think you can use a sliding DFT on your signal. This
>>>way, you will
>>> get a moving estimation of the spectral information
>>>(it's a basic
>>> time-frequency transform, before you use wavelets ;)).
>>>
>>> Matthieu
>>>
>> Matthieu,
>>
>> I am not very familiar with signal processing. Please
>>can
>> you provide a short example ?
>> I have attached the data file. The first column
>>corresponds
>> with the time, the second column represents the signal.
>> Thanks in advance
>>
>> Nils
>
> A wikipedia article states it better than me, so here is
>a link :
> http://en.wikipedia.org/wiki/Short-time_Fourier_transform
>Feel free to ask any question ;)
>
Fine. Let's start with the example from the link
How do I produce the nice spectrograms
from scipy import *
from pylab import plot, show
#
# Example taken from
http://en.wikipedia.org/wiki/Short-time_Fourier_transform
#
def x(t):
if t < 5:
return cos(2*pi*10*t)
if t >= 5. and t < 10:
return cos(2*pi*25*t)
if t >=10. and t< 15:
return cos(2*pi*50*t)
if t >=15. and t<= 20:
return cos(2*pi*100*t)
t = linspace(0.,20.,8001) # sampled at 400 Hz
x_vec = vectorize(x)
signal = x_vec(t)
plot(t,signal)
#
# How can I obtain the nice spectrograms ?
#
show()
...
to be continued
Nils
> In fact, what you will do is :
>
> my_ffts = []
> fo i in range(n):
> my_ffts.append(fft(data[i*size:(i+1)*size]))
>
> with size the size of the sliding window you will use.
>This will give
> you non overlapping FFTs, but you can use overlapping
>FFT, such as :
> my_ffts.append(fft(data[(i-1/2.)*size:(i+3/2.)*size]))
>
More information about the SciPy-User
mailing list