根升余弦(成型)滤波器

成型滤波器定义:

频谱模板:

设计实现:

设计重要的几个指标:带内波纹<0.4dB,带外抑制>40dB,奈奎斯特频率波纹<0.4dB。

在matlab中,有面向对象设计、直接函数设计和工具箱设计的方法。这里采用filterDesigner(fdatool)进行设计。在“Response Type”选择“Raised-cosine”,“Design Method”默认选择“Window”,“Options/Window”选择“Kaiser”,“Options/Beta”填入“3.4”,“Frequency Specifications/Units”选择“Normalized(0 to 1)”,“wc”填入“0.5”,“Frequency Specifications/Rolloff”填入“0.35”,随后调整“Filter Order”直到满足频谱模板即可。

后记

成型滤波器的设计方法有很多,Matlab也有现成的函数和工具箱如rcosfir,fdesign,filterDesigner等,只需要合理的调整设计参数就可以。

同时,在很多应用中,后面常常接内插滤波器,如半带滤波器、CIC滤波器、分数倍内插滤波器等等,也可以做多倍的内插成型滤波器。

在内插成型滤波中,采用多相结构能够有效的降低实现的资源消耗。

附:FPGA实现思路

滤波器的输出:

y(n)=\sum a_{k}*x(n-k)=a_{0}x(n)+a_{1}x(n-1)+a_{2}x(n-2)+a_{192}x(n-192);

同时,系数满足:

a_{0}=a_{192},a_{1}=a_{191},...,a_{95}=a_{97};

因此,

y(n)=a_{0}(x(n)+x(n-192))+...+a_{95}(x(n-95)+x(n-97))+a_{96}x(n-96);

在输入时,将并行的I-Q数据转换为2倍速率的串行格式,输入滤波器的示意图如下。

系数a_{0}a_{1}a_{2}...a_{94}a_{95}a_{96}...y_{0}y_{1}
nQ_{n}I_{n}Q_{n-1} Q_{n-47}I_{n-47}Q_{n-48} Q^{'}_{2n}I^{'}_{2n+1}
n+1I_{n+1}Q_{n}I_{n} I_{n-46}Q_{n-47}I_{n-47} I^{'}_{2(n+1)}Q^{'}_{2n+1}
Q_{n+1}I_{n+1}Q_{n} Q_{n-46}I_{n-46}Q_{n-47} Q^{'}_{2(n+1)}I^{'}_{2(n+1)+1}
n+2I_{n+2}Q_{n+1}I_{n+1} I_{n-45}Q_{n-46}I_{n-46} I^{'}_{2(n+2)}Q^{'}_{2(n+1)+1}

在输出端重构,并行的I-Q数据格式。

I_{out}I^{'}_{2n}I^{'}_{2n+1}I^{'}_{2(n+1)}
Q_{out}Q^{'}_{2n}Q^{'}_{2n+1}Q^{'}_{2(n+1)}

以上,仅仅是自己写代码实现的思路。当然像Xilinx等也有相应的FIR滤波器IP核,能大大降低实现复杂度。

% 这里以16-QAM为例子,产生随机的I-Q信号,并将功率归一化。
sig = randi([0 15],1e4,1);
IQ = qammod(sig,16,'UnitAveragePower',true);

% 加载滤波器系数。
load Num.mat
Num = Num(:);

% 直接实现滤波。
IQ_out = filter(Num,1,upsample(IQ,2));

% 以多相结构实现滤波。
I_out = zeros(length(IQ),2);
Q_out = zeros(length(IQ),2);

% 模拟移位寄存器
buffer = zeros(length(Num),1);
for i=2:length(IQ)
%     输入I
    buffer = [real(IQ(i));buffer(1:end-1)];
    mult = buffer.*Num;
    I_out(i,1) = sum(mult(1:2:end));%将奇数项求和
    Q_out(i-1,2) = sum(mult(2:2:end));%将偶数项求和
%     输入Q
    buffer = [imag(IQ(i));buffer(1:end-1)];
    mult = buffer.*Num;
    I_out(i,2) = sum(mult(2:2:end));%将偶数项求和
    Q_out(i,1) = sum(mult(1:2:end));%将奇数项求和    
end

% 展开为2倍内插结果
I_out = reshape(I_out',[],1);
Q_out = reshape(Q_out',[],1);

% 重新合成I-Q数据
IQ_filter_out = complex(I_out,Q_out);

% 绘制功率谱图
[p,f]=pwelch(IQ_out,hanning(1e3),20,1000,2e6,'centered','power');
plot(f,10*log10(p),'r'); 
hold on;
[p,f]=pwelch(IQ_filter_out,hanning(1e3),20,1000,2e6,'centered','power');
plot(f,10*log10(p),'g'); 
hold off;
两种结构滤波结果-基本完全一致

 

### 成形滤波器的实现原理及其在通信系统中的应用 #### 成形滤波器的作用 成形滤波器的主要作用是对信号进行频谱整形,减少带外干扰并提高传输效率。通过调整信号的频域特性,它可以有效降低码间串扰(ISI),从而提升通信系统的可靠性和抗噪能力[^2]。 #### 数字信号处理基础 成形滤波器的设计通常依赖于数字信号处理技术。其核心思想是利用离散时间傅里叶变换(DTFT)分析输入信号的频谱特征,并通过设计合适的传递函数来控制输出信号的形状。常见的滤波器类型包括低通滤波器、高斯滤波器以及根升余弦滤波器等[^1]。 #### Matlab 中的实现方法 Matlab 提供了丰富的工具箱支持滤波器设计与仿真。以下是基于根升余弦滤波器的一个简单实现示例: ```matlab % 参数设置 Fs = 8000; % 采样率 (Hz) span = 10; % 脉冲响应长度 (符号数) rolloff = 0.25; % 过渡带滚降系数 % 设计根升余弦滤波器 h = rcosdesign(rolloff, span, Fs); % 绘制幅频响应 figure; freqz(h); title('根升余弦滤波器的幅频响应'); xlabel('归一化频率 (\times\pi rad/sample)'); ylabel('幅度 (dB)'); % 应用于信号 data_in = randi([0 1], 1, 100); % 输入二进制数据流 shaped_signal = filter(h, 1, data_in); % 滤波操作 % 显示结果 subplot(2,1,1); stem(data_in,'filled'); title('原始数据序列'); subplot(2,1,2); plot(shaped_signal); title('经过成形后的信号'); ``` 上述代码展示了如何使用 `rcosdesign` 函数创建一个根升余弦滤波器,并将其应用于随机二进制数据流上。该滤波器能够显著改善信号的质量,使其更适合无线信道传播。 #### 关键参数说明 - **滚降因子 (`rolloff`):** 控制过渡带宽度的关键参数,取值范围为 `[0, 1]`。较小的值意味着更陡峭的截止斜率,但也可能导致更高的复杂度。 - **脉冲响应长度 (`span`):** 定义了滤波器的时间跨度,直接影响到计算资源消耗和延迟性能。 这些参数的选择需综合考虑具体应用场景下的误码率要求、硬件限制等因素。 ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值