1 引言 改变声音信号的音调是许多商用设备的一种功能,典型的应属卡拉OK机了。由于发音音调高低因人而异,人们希望伴奏音乐的音调适合自己的嗓音,因此卡拉OK机中设计了专门的硬件来实现这一功能。例如雅马哈公司的用于数字变调的大规摸集成电路 YSS222D和YSS216B,内部集成了A/D,D/A和数字信号处理器,利用采样和重放数据时速度的不同来实现变调。功能,重放比采样速度快则升调,反之则降调。另外,为了使播放时间不变,还需对数据段进行复制或删除。由于商业保密的需要,具体算法未公开,据可询资料实现的系统,不能有效解决因复制或删除数据带来的相位不连续问题。 当前,声卡已成为计算机的基本配置,但无变调功能,为弥补这一缺憾,可以采用件的方法对声音文件重新编码,使声卡回放时音调改变。另外,数字音频工作站也需要软件实现变调功能。因此笔者讨论了3种软件实现算法,围绕着如何变调而不变时间,以及如何解决相位不连接问题,从变调原理着手,讨论了时域实现的理论依据,找到了一种有效的变调方法-- 频域处理法,实验证实效果良好。 2 变调的乐理基础 如果将信号中的所有频率成分升高或降低21/12倍,就能使音调升高或降低一个半音。假设原信号频率为f,变调后频率为f,二者的关系应该满足 f=fx2d/12, d=±1 ,±2,±3 (1) 当d>0时,升调,反之,降调;d每变化1,音调升高或降低一个半音。 一种实现变调的作法[1],[2]是采用硬件实现相似的办法,即改变WAV文件头中有关采样率的信息。如果采样率提高,则声卡回放速度加快,产生升调的效果,同时回放时间变短;反之,产生降调的效果,回放时间变长。为保持时间不变,以帧为单位,利用信号的短时周期性,升调时将帧内后部数据段复制,降调时将帧内后部数据段删除,图1画出了一帧的数据处理情况。可以看到,若是升调,帧间数据是连续的,但由于数据段的复制,帧内数据段间相位不连续;若是降调,帧内数据连续,但帧间数据相位不连续,因此声音质量必然受到影响,产生喀嚓声。
另一种方法是,采用时域抽选和内插[4]。下面分析抽选和内插的频谱,看如何实现变调。抽选表示成下式 表示每M个采样值选1个,其余M-1个舍弃,则信号长度缩短为1/M。抽选后信号频谱和原信号频谱间的关系为 1 M-1
再看看内插的频谱变化。内插时域表示成 表示每两个采样值中插入L-1个零,整个信号长度增加为L倍。内插后信号频谱和原信号频谱间的关系为
抽选和内插后的数据量同样会变短或变长,下面来推导保持数据量不变的具体实现方法。根据上述抽选和内插的频谱变化情况,反推时域变化过程:若将信号作快速离散傅里叶变换(FFT),将谱线沿频率轴扩张或收缩,再作反变换(IFFT),得到的信号应该是被升调或降调,并且数据量保持不变。
4 频域实现的算法研究 现在考虑采用频域实现来解决相位问题。
对于降调,图5(a)是2帧原始信号波形及后一帧的FFT幅度图,图5(b)采用FFT谱线向低频收缩,再IFFI,得到的波形和时域内插法一样,改进措施见图5(c),被处理的连续两帧信号间有一部分重叠,得到的两帧信号波形便能很好地过渡。
X[K]=FFT[x(n)], k=0,1,...N-1 (6)
其中N是帧长,int()表示取整,min()表示取较小值。注意,仅仅对于降调a<l,式(7)才有第2选项的补零,并且x[n]段间重叠。 5 结束语 实现变调的基本原理是改变信号的频率成分,可以通过时域抽选或内插实现,但为保持时间不变,每帧要复制或删除部分数据段,由此带来相位不连续从而影响声音质量。文中提出的频域法,根据变调的原理,将FFT谱线向高频或低频搬移,再作IFFT得到时域信号,若升调谱线搬移过程中采用线性内插,降调采用时域帧间重叠,能消除数据段的不连续问题,改善变调后的声音质量。频域实现无须低通抗混叠滤波或低通反镜像滤波,且FFT是快速算法,假设采用如ADSP2181或TMS320C54X,乘法运算占用单指令周期的DSP芯片,运算量小于1 MIps,实时运算不成问题。可见,频域法是一种有效可行的办法。 | ||||||
免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。