分享

取样频率转换算法(sampling rate converter 简称SRC)

 开花结果 2010-08-19

把模拟声音信号转换为数字声音信号,需要对模拟信号按照一定的取样频率进行取样。目前比较常用的取样频率有8000Hz, 11025Hz, 16000Hz, 22050Hz, 32000Hz, 44100Hz, 48000Hz,另外还有高取样频率88200Hz,96000Hz等。例如CD采用的是44100Hz,而电话则一般采用8000Hz。Mp3文件格式 则支持48000Hz以下所有的取样频率。

假设要设计MP3播放器,为了能够播放所有取样频率,有两种办法。一种是硬件支持,这需要数模转换器支 持多种取样频率,而硬件必须能够产生两套时钟,8000Hz和11025Hz。这无疑增加了硬件成本。第二种办法就是硬件只支持一种取样频率,而通过软件 改变声音信号的取样频率。

转换取样频率的基本方法就是对离散的信号进行插值。插值运算有很多种算法,例如拉格朗日插值法,三阶样条曲线,贝赛尔曲线,以及线性插值等等。这些方法在图形方面应用十分广泛,很多矢量绘图软件都支持几种曲线插值算法。但是这些算法无一能运用到数字声音信号上。

在 数字声音信号领域,我们关心的是插值运算的结果和原声音信号的误差。由香农定理可知,如果取样频率高于声音信号的最高频率的两倍的话,就可以精确地从取样 信号恢复原信号。因此最理想的数字声音信号的插值算法就是基于此理论,从而精确地恢复原信号。得到原信号之后,只要再对其用新的取样频率进行取样,就可以 实现取样频率转换了。这种插值算法被称为限频带插值(Bandlimited Interpolation)。
限频带插值的原理和实现算法的详细资料可以参考http://ccrma./~jos/resample/ 。下面只简单地介绍一下其原理。

假设对于连续时间信号x(t)进行取样之后得到一个数列x(n*T),这里我们用t表示连续时间,n是一个整数,而T是取样周期。我们假设x(t)的频带在-F/2 和F/2之间,F是取样频率,即1/T。
从香农定理可以知道按照如下公式可以从x(nT)计算出x(t)。

x(t) = ∑ x(nT) * h(- nT) ( n=-∞ …∞)
其中,h(t) = sinc(* t) = sin(PI * F * t) / (PI * F * t)

我们来看看这个公式的解释。我们知道,时域两个信号相乘,频域则是这两个信号的频谱进行卷积。取样之后的信号可以看作原信号与周期是T的脉冲信号相乘。于是 取样之后信号的频域就是原信号频谱与周期脉冲信号的频谱的卷积。脉冲信号转换成频域之后,仍然是脉冲形式,间隔刚好是两倍的取样频率。这样卷积出来的结果 就是原信号的频谱在频率轴上不断的重复,就好象时域中的周期信号一样。为了从取样后的信号还原为原信号,就需要对取样后的信号进行滤波,如果使用理想的低 通滤波器,就可以得到-F/2 和F/2范围内的原信号的频谱了。这种理想低通滤波器转换到时域之后,就是sinc函数,所以如果信号与sinc函数卷积的话,就等于对信号进行理想低通 滤波,这正是上面公式所表达的意思。
虽然从理论上来说可以把取样后的信号还原为原信号,但是由于需要和sinc函数卷积,而sinc函数的长度又 是无限的,所以实际上精确地还原原信号是不可能的。在实际运算中,我们可以取sinc函数中值较大的部分进行卷积运算而把很小的值都看作0。这其实就是把 sinc函数和某个窗函数相乘。窗函数如何选择直接影响到最后的还原精度。窗函数要尽量能用较少的点数达到较高的精度。

在实现变调算法 (改变音调,但不改变速度)时我用到过SRC,那时为了方面起见,我直接截取sinc函数的一段进行卷积,相当于选择了矩形窗函数。本以为多取些sinc 函数的点应该能够得到比较好的效果,可是用这个SRC程序对低频声音进行处理的时候,出现了高频噪声。后来选择hanning窗函数与sinc函数相乘, 终于解决了这个高频噪声问题。让我深深地体会到窗函数的重要性。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多