fir1函数:设计FIR滤波器
fir1 基于窗函数的FIR滤波器设计
b = fir1(n,Wn,ftype)
b = fir1(滤波器阶数,截止频率,滤波器种类)
1)截止频率是归一化的截止频率
Wn的所有元素必须严格大于0且严格小于1,其中1对应于奈奎斯特频率:0 <Wn <1。奈奎斯特频率是采样率或πrad / sample的一半。
2)函数会根据截止频率的维度,设计不同的滤波器
如果Wn是标量,则fir1设计一个截止频率为Wn的低通或高通滤波器。 截止频率是滤波器的归一化增益为–6 dB的频率。
如果Wn是二元素矢量[w1 w2],其中w1 <w2,则fir1设计一个具有较低截止频率w1和较高截止频率w2的带通或带阻滤波器。
如果Wn是多元素矢量[w1 w2 … wn],其中w1 <w2 <…<wn,则fir1返回带0 <ω<w1,w1 <ω<w2,…的n阶多频带滤波器。 ,wn <ω<1。
fs=48e3;%采样频率48k fs>=2fc
fc=10e3;%中心频率10kHz
fl=8e3;fh=12e3;
filter_n=1024;%滤波器的阶数
b=fir1(filter_n,2*5e3/fs);%低通滤波器,截止频率为5k
b1=fir1(filter_n,2*5e3/fs);
b2=fir1(filter_n,2*5e3/fs);
c=fir1(filter_n,[fl fh]/(fs/2));%带通滤波器,[8e3,12e3]
作出滤波器的幅频响应曲线
[h,w] = freqz(b,a,n)返回具有存储在b和a中的传递函数系数的数字滤波器的n点频率响应矢量h和相应的角频率矢量w
n —评估点数
512(默认)| 正整数标量
指定为不小于2的正整数标量的评估点数。如果不存在n,则默认为512。为获得最佳结果,请将n设置为大于过滤器阶数的值。
f0=12e3;%中心频率10kHz
fl=10e3;fh=14e3;
filter_n=1024;%滤波器的阶数
c=fir1(filter_n,[fl fh]/(fs/2));%带通滤波器,[8e3,12e3]
freqz(c,1,2048);
经过低通滤波器
数字滤波器用filter函数实现
通过滤波器的传递函数直接可以对输入信号x进行滤波
y = filter(b,a,x)
y = filter(分子,分母,输入参数)
b:分子系数
a:分母系数
x:输入信号
y:输出信号,滤波后信号
b、a的顺序是从0次幂、-1次幂……
根据分子和分母的系数可以直接确定滤波器的有理传递函数。
sig_lowpass=filter(b,1,[sig_ss zeros(1,filter_n/2)]);%经过低通滤波器
sig_ss=sig_lowpass(filter_n/2+1:end);%取后面的点
注意:
1)滤波后不会改变信号的长度
y - 滤波后的数据
向量 | 矩阵 | 多维数组
滤波后的数据,以向量、矩阵或大小与输入数组 x 相同的多维数组的形式返回
2021-09-29 更新
clc;clear all;close all;
load ('receive_demodulate.mat');
%% 设计与通过滤波器
%%
% 设计(1)fir1
filter_order = 128;
w1 = [1/10000 1/10]; % 带通滤波,频率归一化
b1 = fir1(filter_order,w1); % 带通滤波器系数
fvtool(b1,'impulse')
% 设计(2)待补充完善...
%% 通过滤波器
%%
% 通过(1)conv
receive_lowpass1 = conv(b1,receive_demodulate);
receive_lowpass1 = receive_lowpass1(filter_order/2+1:end-filter_order/2);% 前后都去除滤波器阶数的一半
% 通过(2)filter函数
receive_lowpass2 = filter(b1,1,[receive_demodulate ; zeros(fix(length(b1)/2),1)]); % 过低通滤波器
receive_lowpass2 = receive_lowpass2(fix(length(b1)/2)+1:end);
isequal(receive_lowpass1,receive_lowpass2)
% 总结
% (1)conv后,前后都去除滤波器阶数的一半点数,总共将滤波器的长度都不要了
% (2)filter与conv的结果,出来的是一样的!!
% (3)去除卷积中引入的系统长度,都是将输出信号的前系统长度/2与后系统长度/2都丢掉了。
% 根升余弦
receive_shape=conv(receive_lowpass,rh);
% 抽样判决
receive_downsampling = receive_shape(length(rh): N_pn :end-length(rh)-1); % 这里的抽样判决,把2倍的升余弦滤波器的长度减掉了。因为经过了两次升余弦的滤波器。
scatterplot(receive_downsampling);title('降采样的复基带信号');