用Python驗證人耳能分辨的拍頻上限
理力之前有一道作業(yè)題是關(guān)于人耳能否辨別出火車多普勒效應(yīng)產(chǎn)生的兩列波的拍,兩列波的頻率分別是1030Hz和971Hz。?
??
有些同學(xué)沒能區(qū)分拍頻和人耳能聽到的聲音頻率下限20Hz的區(qū)別,在群里發(fā)表了疑惑。雖然這個問題很快就解決了,但另一個問題產(chǎn)生了——人耳能不能分辨7Hz以上的拍?
為了驗證,首先要制作一個可以產(chǎn)生并合成任意頻率的發(fā)生器。這個很自然地就想用程序控制揚(yáng)聲器,但是我只有Python的環(huán)境……
> 老師:可調(diào)頻的發(fā)生器+電磁振蕩喇叭
這個真沒有,除非拆了收音機(jī)。
> 自己繞個線圈就是咯
也沒有,還得拆收音機(jī)。
我還是用python做音頻輸出吧。參考了python實現(xiàn)簡單的聲音文件讀寫(https://blog.csdn.net/m17551052704/article/details/96122117),花了幾分鐘把這個東西做出來了。
運(yùn)行后輸入a、b兩個波的頻率,程序會將a、b頻率的兩個簡諧波合成并保存在"a b.wav"內(nèi)。

合成波最快的方式應(yīng)該是快速傅里葉,但是我懶得寫。就這樣硬算,20s的音頻10秒就能處理完。況且我因為筆記本燒了,現(xiàn)在用的臺式機(jī)CPU是開學(xué)前80塊錢從二手店買的AthlonIIX4 640,3G主頻超到3.75G。一般人用的電腦肯定比我強(qiáng)十倍,懶得寫FFT。
兩個頻率也不宜設(shè)置的太高或者太低,例如我的鐵三角WS-660BT就放不出來低于100Hz的聲音,或者是我在低頻區(qū)聽力受損了(嚇?biāo)牢伊耍€以為是耳機(jī)壞了,原來只是我聾了)。
當(dāng)兩列波頻率差很小時,可以明顯聽到強(qiáng)弱變化,就是所謂的拍:

當(dāng)兩列波頻率相差較大的時候,拍就很難分辨了,如題圖:

那么能分辨的最高拍頻是多少?我做了測驗,個人認(rèn)為30Hz的拍頻還是可以分辨的,甚至題中的59Hz也勉強(qiáng)可以分辨。這個數(shù)值遠(yuǎn)大于7Hz,我認(rèn)為主要原因有兩點:
1. 程序合成的是簡諧波,自然界的聲音都帶有音色,波形很復(fù)雜,并不是簡諧波。這一點可以通過改變波形驗證。
2. 采用的揚(yáng)聲器對聲音輸出做了修改。大部分耳機(jī)/音響都會對特征曲線調(diào)整以更符合人的聽覺感官,不排除在這個過程中聲音有所改變。
首發(fā)于個人博客Wildwizard.cn。