我的理解是输入/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
.那显然确实为我的扬声器提供了正确的输出,但这只是调制后大多数方波听起来基本相同的巧合(我假设)。
然而,当我输出0xff
或0x80
或任何常数时,我会得到预期的静音(并且根据距离的远近,0x80
我会在最后听到很大的咔哒声,如果我使用 则不会发出咔哒声0x80
)......所以脉冲密度调制不能是答案。
那么发生了什么?这是否是有故障的扬声器无法处理低频的迹象(正常频率听起来不错(例如 youtube))?如何输出单周期 1Hz 信号/dev/dsp
?
答案1
等了很久,再看一遍,一切都正常。我用 替换了该out
变量,out=0x80+t%2;
看看是否能听到单个比特的转换,它的音量与原始音量完全相同,但频率更高。因此,我实际上听到音频电平的转换为喀哒声,因为它只有 8 位精度。