I have a random signal containing frequencies from 1Hz to 1000Hz (as viewed on a spectrogram).
I want to extract the signal containing freqs from 200Hz to 600Hz from it and zero out other frequencies (band pass filter). How can I do it in freq. domain efficiently? (since my signal is very long, doing it in time domain is time consuming using filter coefficient method)
Please help with an example.

 Respuesta aceptada

Wayne King
Wayne King el 16 de Abr. de 2012
With such a high sampling frequency and that many samples, why don't you downsample the signal using decimate()?
Since you are only interested in content between 100 and 300 Hz, you can downsample that signal a lot - by at least a factor of 25.
y = decimate(input,25);
That will give you data sampled at 2 kHz and make designing your filter much, much easier.

2 comentarios

zozo
zozo el 16 de Abr. de 2012
this works well..thank you sir. :)
Jan
Jan el 27 de Nov. de 2012
If this solves your problem, please accept this anser.

Iniciar sesión para comentar.

Más respuestas (2)

Wayne King
Wayne King el 16 de Abr. de 2012

0 votos

Have you considered fftfilt()?
You can design your FIR filter using fdesign.bandpass and then use fftfilt().

2 comentarios

zozo
zozo el 16 de Abr. de 2012
fs=1000;
t=0:1/fs:2-1/fs;
x=sin(2*pi*100*t)+cos(2*pi*200*t)+sin(2*pi*150*t)+cos(2*pi*60*t);
f = fs*linspace(0,1,length(x));
plot(f,abs(fft(x)))
i want to have only 100Hz,150Hz freqs in my output signal. How can I do this using fdesign.bandpass?
[I tried but Iam having problems specifying inputs to the function]
zozo
zozo el 16 de Abr. de 2012
Also, how do I convert the object 'd' into double to use it as an input to fftfilt() ?

Iniciar sesión para comentar.

Wayne King
Wayne King el 16 de Abr. de 2012
d = fdesign.bandpass('Fst1,Fp1,Fp2,Fst2,Ast1,Ap,Ast2',75,100,150,175,50,0.5,50,1e3);
Hd = design(d);
y = filter(Hd,x);
If you want an IIR filter
Hd1 = design(d,'butter');
y1 = filter(Hd1,x);
plot(psd(spectrum.periodogram,y1,'Fs',1e3,'NFFT',length(y1)));

7 comentarios

zozo
zozo el 16 de Abr. de 2012
My signal has 38lakh samples. Its taking a lot of time to create the object(d) itself. Is there any alternative of doing it manually?
zozo
zozo el 16 de Abr. de 2012
for example taking fft of the entire signal and multiplying it with a square wave (may be) to spoon out frequency band of interest from the spectrum? Any thing of this sort is possible?
Wayne King
Wayne King el 16 de Abr. de 2012
The first time you call fdesign, it does take a bit of time, but that shouldn't bother your filtering. Once you have the filter, it should be fine. What is 38lakh? 381,000 samples?
zozo
zozo el 16 de Abr. de 2012
38,00,000 samples (76 seconds at 50,000Hz sampling freq).
I have run it half n hour back and still my Matlab is 'busy' creating the object(d).
Wayne King
Wayne King el 16 de Abr. de 2012
I don't know what specifications you have asked for, but they may have been overly stringent
zozo
zozo el 16 de Abr. de 2012
It is a signal recorded by an array of microphones. When viewed on a spectrogram, there was a line passing between the band of 100Hz and 300Hz. To further process it, I needed to scoop out signal from this band of frequencies(ignore other frequencies to reduce noise contribution) efficiently.
Joydeb Saha
Joydeb Saha el 19 de Jun. de 2021
How to remove the spikes from the data with a narrow bandpass filter? How to apply an inverse FFT algorithm to recreate the time-series data (filtered) from the frequency domain to the time domain? attaching the data.

Iniciar sesión para comentar.

Preguntada:

el 16 de Abr. de 2012

Comentada:

el 19 de Jun. de 2021

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by