"/dev/dsp" 출력에 "펄스 밀도 변조"(일종의)가 있는 이유는 무엇입니까?

"/dev/dsp" 출력에 "펄스 밀도 변조"(일종의)가 있는 이유는 무엇입니까?

제가 이해한 바에 따르면 입력은 /dev/dsp8비트 부호 없는 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비트에 불과하기 때문입니다.

관련 정보