使用 Matlab 接收与 Filter Designer 相同的系数
Using Matlab to receive the same coefficients as from the Filter Designer
我目前正在处理 IIR 滤波器系数。所以现在我想变得更灵活一点,因为在过滤器设计器中键入大量过滤器有点麻烦,然后复制每个值以将固定点表示形式转换为十六进制。
所以我打算写一个脚本。我遇到的问题是:我找不到以与过滤器设计器相同的方式提供值的 matlab 函数。对于 8 阶 IIR 滤波器,Designer 输出每个部分的值,包括增益、3 个分子值和 3 个分母值,如下图所示。
现在,我在 Matlab 中尝试使用:
fs = 50000; %Hz
fnormalize = 2/fs;
fstop1 = 1000*fnormalize; %Hz
fstop2 = 8000*fnormalize;
f1filter = 3000*fnormalize; %Hz
f2filter = 4000*fnormalize; %Hz
filterOrdnung = 4; %erzeugt (2 * filterOrdnung) Filterkoeffizienten
%weil Kombination zwei Tiefpässen.
anzahlFilter = 1; %Anzahl der zu berechnenden Filter zur Auswertung
schrittweiteVerschiebung = 10; %Verschiebung in Hz
astop = 60; %Verstärkung an den Bandgrenzen des Bandpasses
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
frequenzVektor = zeros(1,anzahlFilter); %f - Vektor für Mittenfrequenz
[z, p, k] = cheby2(filterOrdnung, astop, [f1filter f2filter], 'bandpass');
[sos, g] = zp2sos(z,p,k); %Output form:[b01,b11,b21,1,a11,a21
% b02,b12,b22,1,a12,a22
% b0N,b1N...........a2N]
%Also: 1. Zeile: Nullstellen Filter 1, Polstellen Filter 1,
% 2. Zeile: Nullstellen Filter 2, Polstellen Filter 2 etc..
sos_quant = zeros(8,6);
for i = 1:filterOrdnung
for k = 1 : 6
sos_quant(i,k) = quantizenumeric(sos(i,k),1,16,14,'fix');
end
end
fvtool(sos);
但我并没有在每个部分都获得收益。因为我不想在不必要的情况下更改我的 VHDL 模型,所以我想问你,你是否知道一个函数可以像 Filter Designer 那样为我提供信息。
您可以使用滤波器设计器为您生成 Matlab 代码。这应该与设计人员用来查找系数的代码完全相同。所以我假设系数也是相同的。
在过滤器设计器中:File -> Generate MATLAB code -> Filter design function
所以您可以自己检查代码的差异。
我目前正在处理 IIR 滤波器系数。所以现在我想变得更灵活一点,因为在过滤器设计器中键入大量过滤器有点麻烦,然后复制每个值以将固定点表示形式转换为十六进制。
所以我打算写一个脚本。我遇到的问题是:我找不到以与过滤器设计器相同的方式提供值的 matlab 函数。对于 8 阶 IIR 滤波器,Designer 输出每个部分的值,包括增益、3 个分子值和 3 个分母值,如下图所示。
现在,我在 Matlab 中尝试使用:
fs = 50000; %Hz
fnormalize = 2/fs;
fstop1 = 1000*fnormalize; %Hz
fstop2 = 8000*fnormalize;
f1filter = 3000*fnormalize; %Hz
f2filter = 4000*fnormalize; %Hz
filterOrdnung = 4; %erzeugt (2 * filterOrdnung) Filterkoeffizienten
%weil Kombination zwei Tiefpässen.
anzahlFilter = 1; %Anzahl der zu berechnenden Filter zur Auswertung
schrittweiteVerschiebung = 10; %Verschiebung in Hz
astop = 60; %Verstärkung an den Bandgrenzen des Bandpasses
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
frequenzVektor = zeros(1,anzahlFilter); %f - Vektor für Mittenfrequenz
[z, p, k] = cheby2(filterOrdnung, astop, [f1filter f2filter], 'bandpass');
[sos, g] = zp2sos(z,p,k); %Output form:[b01,b11,b21,1,a11,a21
% b02,b12,b22,1,a12,a22
% b0N,b1N...........a2N]
%Also: 1. Zeile: Nullstellen Filter 1, Polstellen Filter 1,
% 2. Zeile: Nullstellen Filter 2, Polstellen Filter 2 etc..
sos_quant = zeros(8,6);
for i = 1:filterOrdnung
for k = 1 : 6
sos_quant(i,k) = quantizenumeric(sos(i,k),1,16,14,'fix');
end
end
fvtool(sos);
但我并没有在每个部分都获得收益。因为我不想在不必要的情况下更改我的 VHDL 模型,所以我想问你,你是否知道一个函数可以像 Filter Designer 那样为我提供信息。
您可以使用滤波器设计器为您生成 Matlab 代码。这应该与设计人员用来查找系数的代码完全相同。所以我假设系数也是相同的。
在过滤器设计器中:File -> Generate MATLAB code -> Filter design function
所以您可以自己检查代码的差异。