|
发表于 2008-4-23
|
|阅读模式
调音器的功能
调音器能够对输入的声音信号进行分析,找到输入声音的音调。在乐器调音中非常有用。
基本设计思路
调音器的原理并不复杂,对输入信号进行FFT变换,找到频谱中能量最大的频率,然后把频率转换成音调即可。
例如,若输入信号的取样频率为44100Hz,FFT的长度为1024,FFT变换之后能量最大的位置为100的话,那么输入信号的频率就是44100/1024*100=4307Hz。
频率转音调
一般把频率440Hz定为标准音A4。频率增加一倍,音阶增加一。因此880Hz为A5,而220Hz为A3。从A4到A5要经历如下12个音:
A4,A4#,B4,C5,C5#,D5,D5#,E5,F5,F5#,G5,G5#
这12个音的频率组成一个等比数列,因此可以求出每两个音之间的频率比是2^(1/12)= 1.0594630。所以A4#的频率为:440*1.0594630=466.164Hz。
为了提高调音器的精度,在每两个相邻的音之间再插入8个中间音,以A4,A4#为例,用如下形式表示:
A4,A4 +1,A4 +2,A4 +3,A4 +4,A4# -4,A4# -3,A4# -2,A4# -1, A4#
这样每个小刻度提高的频率倍数为:1.05946300^(1/9)= 1.006439。我们可以利用这个最小刻度比来计算出音调和频率的对应表。
若调音器程序能找出输入信号的频率,再通过这张表就可以查得相应的音调了。由于在每两个音调中插入了8个中间值,所以调音器可以很准确地显示出输入声音与标准音调之间的细微差别,以便于用户对乐器进行手工调整。
精度
假设调音器最低能识别A1,也就是55Hz,那么A1 +1的频率为1.006439*55=55.354Hz。由等比数列的性质,很容易知道A1 +1和A1之间的频率差0.354Hz是最小的频率差,因此所需的频率精度就是0.354Hz/2=0.18Hz。也就是说为了分辨我们设定的音调的最小单位,频率计算程序的精度必须达到0.18Hz。
FFT的最小分辨频率可以由下面的公式求得
最小分辨频率=取样频率/FFT长度
这就是说输入信号的取样频率为44100Hz时,若要最小分辨频率为0.18Hz的话,那么所需的FFT长度是44100/0.18=245000。而收集这245000个数据需要245000/44100=5.6秒。显然FFT的运算长度和数据收集时间都是不实际的。
下面介绍两个方法来解决这个问题。
降低取样频率
为了缩短FFT的运算长度,而保持最小分辨频率的精度,只能降低取样频率。假设我们固定FFT长度为4096,为了使精度达到0.18Hz,取样频率应为4096*0.18=737Hz。即对于44100Hz的输入数据,每60个数据取一个数据的话,就可以用4096的FFT长度来实现0.18Hz的精度。但香农定理告诉我们,取样频率必须大于输入信号最高频率的两倍,才能够从取样后的信号还原为原信号。如果取样频率是737Hz,那么输入的声音信号的最高频率就不能超过369Hz。而显然调音器的输入有可能超过这个频率。
解决这个问题的办法就是根据输入信号的频率,动态地决定取样频率。0.18Hz 的精度是按照最低音A1计算的。而当输入频率提高n倍时,所需的最小分辨频率也将增大n倍。例如,如果要区分A4和A4 +1的话,最小分辨频率就是0.18Hz*440/55=1.44Hz,那么设定取样频率为5898Hz即可,也就是每8个数据取一个(44100/8=5512Hz)。
为了能够动态地确定取样频率,可以先用原取样频率(44100Hz)对输入信号进行粗略地分析。这时的最小分辨频率为44100/4096=10.77Hz。粗略地找到了输入信号的频率之后,根据这个频率调低取样频率,再进行精确计算。
补零
通过动态地降低取样频率可以缩短FFT的运算长度,但不能解决数据收集时间过长的问题。虽然我们要进行4096点FFT运算,但这并不表明一定要收集4096个数据。如果只收集512个数据,其余的数据全部填0的话,那么数据收集时间就缩短为原来的1/8。而这并不会降低所得的频率的精度。(当收集的数据过少的时候,会出现误差。只要收集的数据中有足够多的信号周期,则不会出现频率误差) |
|