Audio

為什麼“/dev/dsp”輸出帶有“脈衝密度調製”(有點)?

  • July 6, 2020

我的理解是輸入/dev/dsp應該是一個 8 位無符號 PCM 信號/字元流。

然而

$ cat a.c
#include <stdio.h>
#include <math.h>
int
main(){
   uint32_t t;
   uint8_t out;
   for(t=0;t<8000;++t){
       out=(sin((double)t/8000*2*M_PI)+1)/2*0xff;
       putchar(out);
       //fprintf(stderr,"%d\n",out);
   }
   return 0;
}

$ gcc a.c;./a >/dev/dsp

輸出具有 420242024 等頻率調製的聲音 1 秒(即“高->低->高->低->高”頻率)。我期待的輸出是一個單週期的 1Hz 頻率,我無法用耳朵聽到。我能聽到任何聲音令人驚訝。

我能想到的唯一可以解釋我所聽到的是特殊文件是否通過脈衝密度調製/dev/dsp輸出到揚聲器。

脈衝密度調製.

因為當我的信號的導數最高或最低時,來自脈衝的咔噠聲(在高頻聽起來像方波)具有更高的頻率,並且在我的信號的峰值和谷值處具有最低頻率。

如果您想要一些硬核朋克搖滾/技術(無論如何),請使用out=t*((t>>9|t>>13)&25&t>>6);並刪除t<8000. 這顯然確實為我的揚聲器提供了正確的輸出,但這只是調製後大部分方波聽起來幾乎相同的巧合(我假設。)。

然而,當我輸出0xff0x80或任何常數時,我得到了預期的靜音(並且取決於距離0x80我在最後聽到響亮的咔嗒聲,如果我使用沒有咔嗒聲0x80)……所以脈衝密度調製不能成為答案.

那麼發生了什麼?這是否表明有故障的揚聲器無法處理低頻(正常頻率聽起來不錯(例如 youtube))?如何將單週期 1Hz 信號輸出到/dev/dsp

等了半天,又看了一遍,一切都按原樣進行。我將out變數替換為out=0x80+t%2;以查看是否可以聽到單個位轉換,它的音量與原始音量完全相同,但頻率更高。所以我確實聽到了音頻電平的轉換作為點擊,因為它只有 8 位精度。

引用自:https://unix.stackexchange.com/questions/590292