我在一个函数脚本中使用matlab创建一个音频文件,该脚本有一个名为" filtro_pf"的函数。由我创建的带通滤波器,其输出是IIR对应的系数:
[b,a] = filtro_pf(Ap,As,fp1,fs1,fp2,fs2,1); //BAND PASS FILTER
b2 = [0.0039,0,-0.0156,0,0.0234,0,-0.0156,0,0.0039];
a2 =[1.0000,-6.2682,17.2660,-27.3421,27.2582,-17.5284,7.0998,-1.6555,0.1701];
wfpf = filter(b,a,audio_stream);
wavplay(wfpf,fs);
注意第二行和第三行(b2和a2)是函数< filtro_pb()'给了我那些投入。我已经运行过一次,然后将它们复制到这些变量中。现在,在我运行这个脚本后,如果我要求' a'和' a2'在控制台我会:
a =
1.0000 -6.2682 17.2660 -27.3421 27.2582 -17.5284 7.0998 -1.6555 0.1701
a2 =
1.0000 -6.2682 17.2660 -27.3421 27.2582 -17.5284 7.0998 -1.6555 0.1701
他们几乎一样。但如果我使用' a2'而不是'在filter()函数中,它不起作用。我听到了一种嘀嗒声,那就是它。用' a'我能听到正确过滤的声音。之前使用过相同的代码,它确实有效:
%[b,a] = filtro_pa(Ap,As,fp,fs,1); //HIGH PASS FILTER
b = [0.5411 -1.6232 1.6232 -0.5411];
a = [1.0000 -1.8062 1.2298 -0.2925];
wfpa = filter(b2, a2, audio_stream);
wavplay(wfpa,fs);
同样,我之前使用过这个脚本,看到这些值(来自a2和b2)是这些输入的输出。现在我没有再次调用该函数(通过这种方式进行评论),而是使用' a'和' b'矢量直接。它适用于LowPass和HighPass过滤器。
所有这些都是出于测试目的,所以我不希望像"为什么使用向量而不是调用函数呢?"。
我只想知道,如果它们几乎相同,那么该函数如何才能与第二个变量一起使用?
答案 0 :(得分:1)
变量中存在的精度高于显示的精度,这意味着您的a2
和b2
向量与a
和b
不同。令人惊讶的是,该订单上的错误会使过滤器不稳定,但似乎正在发生的事情。您应该能够通过查看带有freqz
的过滤器响应,并通过绘制生成的音频向量而不是仅仅听取它来探索这一点。
您可以使用format long
打印更高的精度,但这些仍会出现一些舍入错误。要避免,请将向量保存到.mat文件并重新加载。 .mat文件将使用二进制格式并存储向量的完整精度。
它适用于其他滤波器的原因可能是因为这些滤波器对其系数中的舍入误差不太敏感:它们具有较少的系数,并且这些系数的值不太极端。
以下是频率响应的示例比较:
[H W] = freqz(b2, a2); % your filter (with error)
a_error = zeros(size(a2));
a_error(9) = a_error(9)+.001; % a little bit of error in a single coefficient
[HE WE] = freqz(b2, a2 + a_error); % frequency response of THAT filter
plot(log10(abs([H HE])))
正如您所看到的,一个小小的变化会带来很大的不同。
对不稳定性的实际分析来自于查看过滤器的极点和零点:
[z p k] = tf2zp(b2, a2);
abs(p)
如果任何极点的幅度大于1(此极点),则滤波器将不稳定。尝试真正的价值,然后你的近似"价值观,看看会发生什么。