Cut-off frequency not reached with my equiripple-filter

Hi, I am new to filter design and I have designed an equiripple filter in matlab using the commands:
Hd=fdesign.lowpass('Fp,Fst,Ap,Ast',30000000,50000000,1,60,1000000000);
d=design(Hd,'equiripple');
With a passband frequency of 30MHz and a stopband frequency of 50MHz. However, when I filter the signal
x=1:100000;
y=2+sin(1000*x)+5*sin(1*10^9*x);
with the command
h=filter(d,y);
both sine-functions are reduced. But sin(100*x) should go through and I don't understand why it doesn't. Does anyone know what I am doing wrong?
Thanks Jenny

 Risposta accettata

Hi Jenny, you don't tell me what Fs is here so I cannot say whether or not your design is correct.
Is Fs 10 kHz? in your time vector? if so then why are you stepping in increments of 1/(4*Fs)?? That changes the sampling rate. Your time increments have to be 1/Fs by definition.
Fs = 1e4;
t = 0:1/Fs:1-1/Fs;
y=sin(1000*2*pi*t)+cos(2*pi*250*t);
% design filter
Hd=fdesign.lowpass('Fp,Fst,Ap,Ast',500,700,0.5,60,10000);
d=design(Hd,'equiripple');
out = filter(d,y);
outdft = fft(out);
plot(abs(outdft))
The sampling rate you use for the signal has to match the sampling rate used in the filter design.

Più risposte (3)

I don't see that with your unit step time vector, your frequencies in
y = 2+sin(1000*x)+5*sin(1e9*x)
are appropriate. What frequency do you think sin(1000*x) is?
Your x vector has unit steps. If we translate this to your sampling frequency (used in your filter design) of 1 gigahertz, then these frequencies are aliased.
f = 1000/(2*pi)
Now with a unit step that means it has a period less than 1 sample. The period of sin(1000*x) is (2*pi)/1000. That's above the Nyquist considerably and therefore so is sin(10^9*x) even more so.
Why are you defining your signal like this? Why not use a time vector where you use the sampling interval that corresponds to your sampoing frequency?
Fs = 1e9;
t = 0:1/Fs:(1e5*(1/Fs))-(1/Fs);
I just set up t to be the same length as your original x.
Now define your sine waves over the t vector.
Thank you very much Wayne!
Your reply helped me generate a signal with the frequency I intended it to have, I didn't think about aliasing. However, when I create a signal (with the correct frequency), that should be damped, it's still there. So I wonder if I am still doing something wrong with the signal-generating. I decided to work with lower frequency levels (just to make it a bit easier) and I have generated a filter and a signal with the following commands:
Filter
Hd=fdesign.lowpass('Fp,Fst,Ap,Ast',500,700,0.5,60,10000);
d=design(Hd,'equiripple');
Signal
t = 0:1/(4*Fs):(100*(1/(Fs)))-(1/(Fs));
y=sin(1000*2*pi*t);
Then I filtered the signal using the command
h=filter(d,y);
But I still see a signal with amplitude 1, shouldn't it be reduced since the 1000 Hz-signal is above the frequency stop of 700?
Oh, yes, now I can see that it works, thank you!
I did not now that the sampling rates had to be the same, why is that? I decided to divide it by four because the generated signal became smoother when I worked with higher frequencies, but I guess I just have to raise the sampling rate in that case?

Community Treasure Hunt

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

Start Hunting!

Translated by