文章目录
- 前言
- 一、频域均衡器的设计
- 二、MATLAB源代码
- 1.firls函数与freqz函数
- 2.MATLAB仿真源代码
- 3.代码说明
- 三、仿真结果画图
前言
利用MATLAB的firls函数,根据所要求的频率向量和频响幅度向量,设计出所需的均衡器,使得包括滤波器在内的系统总的频率特性符合要求。给出完整的MATLAB设计源代码。
一、频域均衡器的设计
均衡器主要是用于作补偿的。所谓的均衡器,就是起补偿作用的滤波器。所谓的均衡器设计,其实就是设计符合要求频响的滤波器(系数)。
频域均衡就是对系统的进行频率特性的补偿。所以,均衡器的设计,就是根据系统的频率特性,设计一个补偿滤波器,使得包括滤波器在内的系统总的频率特性符合要求。具体而言,就是设计一个滤波器,使得其在其各段频率的频响为特定的值。当然,均衡器(也即滤波器)的阶数、形式(type I 或type II)也是设计的内容,不过,最主要的还是频响的设计。
例如,根据对某个音频系统的功率谱的测量,发现在2000Hz~4000Hz频谱范围内其功率谱幅度呈上开口抛物线形状,曲线底部最大衰减6dB,若要求在这个频谱范围内功率谱平坦,则可以设计一个在2000Hz~4000Hz之间的功率谱分量做最大6dB的增益提升,整个补偿频段的频响为下开口的抛物线形,左右对称。则经过均衡,整个系统的功率谱将符合平坦性要求。下面给出这个例子的MATLAB源代码。
二、MATLAB源代码
1.firls函数与freqz函数
在系统的设计与分析中,firls与freqz是两个非常重要的函数。其中,firls函数可以由频响计算得到fir滤波器的系数,而freqz函数用于由滤波器系数计算其频响。
使用freqz函数计算滤波器的频响见:
(47)MATLAB使用freqz画滤波器的频响
2.MATLAB仿真源代码
代码如下:
%% 参数设置
fs = 8e3; % 采样率
f_nyquist = fs/2; % Nyquist频率
nTaps = 40; % 均衡器的阶数% 设置频率向量,范围:0到fs/2
f1 = 100:100:2000; % 频带划分
f2 = 2100:100:fs/2; % 频带划分
f = [f1, f2]; % 频率向量,单位Hz% 设置功率谱增益,dB值
g1 = zeros(1,length(f1));
g2 = [0.8,2.2,2.82,3.89,4.34,5.07,5.35,5.74,5.86,5.91, ...5.86,5.58,5.35,4.73,4.34,3.38,2.82,1.53,0.8,0];
g = [g1, g2]; % 功率谱增益向量应该和频率向量大小相等
%% 设计均衡器
Amp = 10.^(g/20); % 功率谱增益dB值转换为频响幅度线性值
b_eq = firls(nTaps,f/f_nyquist,Amp); % firls要求频率向量对Nyquist频率归一化
%% 均衡器频响分析
N = 256; % 滤波器频响向量的长度
[Hn,Fn] = freqz(b_eq,1,N); % Hn:复频响向量;Fn:数字频率向量w
%% 对比画图
figure()
plot(f, g, 'LineWidth',1.5);
hold on
grid on
plot(Fn*fs/2/pi, 20*log10(abs(Hn)), 'r', 'LineWidth',1.5);
legend('期望的', '设计出来的','Location','NorthWest')
% axis([0 4000 -1 6]);
axis([1500 4000 -1 6]);
title('均衡器功率谱频响')
xlabel('频率(Hz)')
ylabel('功率谱幅度(dB)')
3.代码说明
(1)设置频带边沿向量(vector of frequency band edges)时,频带范围0到fs/2。若EQ要求的是在频段2kHz到4kHz之间做补偿,而采样率为16ksps,则频带向量也需要完整列出0Hz到8kHz之间的整个频带范围。
(2)若给出的频响增益是线性值,而非对数值,则不必进行转换,直接应用于firls。因为函数firls要求的入参是线性值,即在哪个频段放大或减小多少倍,而非加减多少dB。