제가 이해한 바에 따르면 입력은 /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
특수 파일이 다음과 같은 파일로 출력되는지 여부입니다.펄스 밀도 변조.
.
펄스는 신호의 도함수가 가장 높거나 낮을 때 딸깍거리는 소리(고주파에서 구형파처럼 들리는 소리)를 내기 때문에 신호의 최고점과 최저점에서 더 높은 주파수를 가지며 가장 낮은 주파수를 갖습니다.
하드코어 펑크 록/테크노 음악을 듣고 싶다면 That을 사용 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비트에 불과하기 때문입니다.