前言
虽然Audition等音频处理工具现在可以轻松实现音频信号的升降采样操作,但还是想亲手操作一下才能更深刻地体会其原理。
理论部分数字信号处理书上写得很清楚,假如要升采样N倍,那就在原始信号每两个点之间补N-1零,原本有a个点的信号补零后变成了N*a个点,最后过一个低通滤波器就可以了。假如我们手中有一个采样率是8kHz的信号,根据采样定理信号中最大的频率成分应该是4kHz,无论对其升采样多少倍,信号中最大的频率成分依旧是4kHz。用8k采样频率打开原始信号,和用升采样后相应的采样频率打开升采样后的信号,听起来应该是一模一样的,所以低通滤波的截止频率定为原信号的采样频率的一半。
可以看到,fs=8kHz升采样两倍到fs=16kHz,但4kHz以上的语谱图漆黑一片,因为低通滤波器滤掉了4kHz以上的频率成分。而4kHz以下的部分和原始信号完全一致,听起来也毫无差异。
现在我们对一个fs=8kHz的信号升采样两倍到fs=16kHz。
一、操作步骤
1.设计低通滤波器
用matlab的filterDesigner(老版本叫fdatool)功能设计一个低通滤波器。
响应类型选择低通,设计方法选择FIR滤波器,采样频率为16000Hz,通常滤波器的边缘无法做到极为锋利,所以会让出一定频率。通带频率定为3800Hz,阻带频率定为4000Hz(事实证明让通带阻带截止频率相等会报错),阻带衰减设为60dB其他参数默认即可。设计好的低通滤波器为158阶。之后点击目标——生成C文件——导出为双精度浮点数。这时就已经成功导出我们需要的低通滤波器的参数啦。
得到的参数如下:
const int BL = 159;
const real64_T B[159] = {
0.001896059819653, 0.00820094837682, 0.01314470859597, 0.01066527577552,
0.0009246408389606,-0.005814546012738,-0.002930262262176, 0.003349544159389,
0.003146652916839, -0.00209518582678, -0.00309180989114, 0.001386488161517,
0.003041700406133,-0.0009218026015368, -0.00304631268199,0.0005614333728956,
0.003100614445479,-0.000237163275515,-0.003190847597665,-8.734993325528e-05,
0.003304776236801, 0.000438069901197,-0.003423584634794,-0.0008263738009497,
0.003529681299126, 0.001253489063053,-0.003613907436449,-0.001721095555101,
0.003669424233881, 0.00223419572336