乐器调音器

1,008 阅读5分钟

调音器能够对输入的声音信号进行分析,找到输入声音的音调。在乐器调音中非常有用。 

 基本设计思路 

调音器的原理并不复杂,对输入信号进行 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。而这并不会将低所得的频率的精度。(当收集的数据过少的时候,会出现误差。 只要收集的数据中有足够多的信号周期,则不会出现频率误差) 

 处理倍音 

大多数乐器所发出的声音都包含有倍音,而且有时倍音的能量可能超过基础音,尤其是频率较低的时候。 处理倍音比较麻烦,大概步骤是先找出所有的局部最大能量的频率,即局部峰值对应的频率,这些频率很可能是倍音频率。 找出其中成倍的频率,剔除一些不相干的噪音频率。 从一系列倍频推算出基础频率。 另外在确定取样频率的时候,需要考虑倍频的存在,所以取样频率不能仅靠最大能量的频率计算,而需要考虑最大的倍音的频率。这样才不会出现取样频率过低而导致频域重叠。