2011-06-01 28 views
0

我有一個相當不同的問題。所以我在一臺Linux Gentoo機器上使用了Matlab。我有一些華碩Xonar STX聲卡,我試圖用它們作爲敏感的音頻頻率分析儀,使用PlayRec非阻塞音頻IO包。在Linux上的Matlab中的24位聲音捕獲

現在我知道Matlab會說如果您嘗試使用audiorecorder函數並在linux中指定24位,它會告訴您24位只在Windows中受支持。然而,ALSA文獻並不意味着這是操作系統或ALSA本身的限制,事實上Alsa似乎允許您指定24位PCM設備。 PlayRec使用PortAudio,然後在Linux系統上使用Alsa。

現在,這一切都很好,而且Playrec似乎沒有指定位深度的方法,只是採樣率。我已經運行了很多測試,並且知道我的聲卡的傳輸函數是什麼(浮點返回值與輸入電壓轉換比率),我知道我的峯值電壓是3V,我的噪聲是100uV左右。這給我20 * log10(3/100e-6)= 91dB。這更接近我期望從16位而不是從24看到的。

我真正的問題是這樣的嗎?是否有某種方法來驗證我實際上獲取了24位的捕獲信號?

如果我不是,ALSA或Matlab有一些固有的侷限性,它會限制我從聲音捕獲設備只有16位數據,即使使用第三方程序來收集數據。

回答

1

如果您觀察到playrec通過playrec('getRec', ...)輸出的數據,您會發現它總是單精度浮點數(在Windows上進行測試,MATLAB R2013b,most current Playrec)。 (在使用Playrec記錄單個頁面並在IDE的工作區窗口中查看或在命令行上運行whos('<variable_name_of_page>')

如果您查看Line 50 of pa_dll_playrec.h,您會看到單精度是顧名思義選擇:

/* Format to be used for samples with PortAudio = 32bit */ 
typedef float SAMPLE; 

不幸的是,這並不能完全回答的準確樣本精度的問題,因爲PortAudio LIB從API的格式改變到轉換樣本所定義的一個所以,如果你想知道什麼。精確度你實際得到,我會建議一個非常實用的解決方案:看32位浮點數的尾數。簡單的fprintf('%+.32f\n', data)應該足以找出實際使用的小數位數。


編輯:我才意識到我聽錯了。但是這裏有個訣竅:將音頻從音頻設備的空頻道錄製下來。繪製記錄的數據並放大噪底。如果你只是簡單的零,設備可能沒有正確激活(或有一個很好的信號/噪聲比)。嘗試一個外部接口和/或調高增益一點點)。根據記錄數據的實際位分辨率,您將看到樣本中的量化步驟。取決於量化器最初使用的位深度,這些步驟更大或更小。下面你會看到16位(左)和24位(右)在左邊seperately記錄塊,從相同的音頻設備,只是我用PortAudio的WASAPI API(在Windows上,很明顯)之間的比較ASIO右邊:

Comparison of sample quantization of 16-bit (left) and 24-bit (right) audio

的區別是相當明顯的:在這些非常低的水平,16位只允許三個值,而24位具有更精細步進。因此,這應該是一個足夠的答案就如何確定真正位深度,如果你的信號被記錄在24位你的問題。如果有小於2^-15的樣本步驟,則賠率相當不錯。

展望這個話題讓我意識到,這在很大程度上取決於當前選擇的記錄設備,其位深度的量化實際發生的的API。 ASIO似乎總是使用24位,而例如WASAPI則回落到16位。

+0

但是,僅僅因爲你知道FP編號中有多少位並不能真正幫助你呢?除非你有辦法在A/D上操縱一個LSB​​。然後你可以看到這是如何影響浮點值相對於滿量程和確定精度的位。只要它是一個黑盒子做A/d(整數值) - >單精度浮點不知道的傳遞函數,有沒有辦法來確定哪些位你是從聲卡A/d得到解決。 – dynamphorous 2014-03-31 18:50:41

+0

@dynamphorous你是對的。我上面更新了我的答案。 – 2014-04-01 12:09:37

+0

我會告訴你這是一種可能的方法。但是我從來沒有見過一個聲卡,它的噪底基本上不超過量化器的LSB。所以我想我可以在我的白色光譜中尋找儘可能最小的一組步驟,並嘗試假設這是我的最小量化步驟。但它對我仍然感覺很糟糕。我會將其標記爲答案,因爲我可以告訴你的確在其中考慮了相當多的想法,並且如果Johnson噪聲低於量化器的LSB,這是一個合理的答案! – dynamphorous 2014-04-01 16:26:53

0

如果您可以將該信號存儲爲wav文件,請在Linux中的命令行上對wav運行file命令。例如:
​​會給你採樣率和文件編碼的位。輸出通常類似於:16位,16000Hz等。

+0

好吧,我想你是怎麼想的,唯一的問題是,它的讀入Matlab的時候,信號變爲2個聲道單精度浮點數。因此,寫入wav文件,使用wavwrite,或其他一些功能似乎是它會那麼只需將文件轉換爲位深和採樣率你指定,而不是保留它有特點,當它剛出來的廣告。這就是爲什麼我把自己的S/N計算結合在一起,因爲Xonar STX應該具有118dB的動態範圍(他們在手冊中用音頻精度證明了這一點),而且我得到了91dB。 – dynamphorous 2011-06-03 15:31:05