为什么“/dev/dsp”输出带有“脉冲密度调制”(有点)?

为什么“/dev/dsp”输出带有“脉冲密度调制”(有点)?

我的理解是输入/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

输出 1 秒具有类似 420242024 的频率调制的声音(即“高->低->高->低->高”频率)。我期望的输出是单周期 1Hz 频率,我的耳朵听不到。我能听到任何声音真是令人惊讶。

我能想到的唯一能解释我所听到的是,如果/dev/dsp特殊文件正在输出到带有脉冲密度调制

脉冲密度调制

由于当信号的导数最高或最低时,脉冲发出的咔哒声(在高频下听起来像方波)具有较高的频率,并且在信号的波峰和波谷处具有最低频率。

如果您想听一些硬核朋克摇滚/科技音乐(无论什么),请使用out=t*((t>>9|t>>13)&25&t>>6);并删除t<8000.那显然确实为我的扬声器提供了正确的输出,但这只是调制后大多数方波听起来基本相同的巧合(我假设)。

然而,当我输出0xff0x80或任何常数时,我会得到预期的静音(并且根据距离的远近,0x80我会在最后听到很大的咔哒声,如果我使用 则不会发出咔哒声0x80)......所以脉冲密度调制不能是答案。

那么发生了什么?这是否是有故障的扬声器无法处理低频的迹象(正常频率听起来不错(例如 youtube))?如何输出单周期 1Hz 信号/dev/dsp

答案1

等了很久,再看一遍,一切都正常。我用 替换了该out变量,out=0x80+t%2;看看是否能听到单个比特的转换,它的音量与原始音量完全相同,但频率更高。因此,我实际上听到音频电平的转换为喀哒声,因为它只有 8 位精度。

相关内容