2017-10-04 8 views
-3

rtaudio에서 간단한 사인파를 생성하여 무슨 일이 일어나는지 확인하려고합니다. 그러나 그것은 잘못 나온다.사인파 생성 중 : 잘못된 출력

전 세계에 float timec이고, 샘플로 버퍼를 채우는 openStream으로 콜백이 호출되었습니다.

float freq = 440; // center frequency 
int SAMPLE_RATE = 44100; 
for (int i = 0; i < numFrames; i++) { 
    float v = sin(2 * M_PI * freq * (timec/SAMPLE_RATE)); 
    outputbuffer[i] = v; 
    timec++; 
} 

내가 잘못 했습니까? 사인파 대신에 낮은 연삭 음이 들립니다.

+0

디버거를 사용하고 디버거에 'timec/SAMPLE_RATE'값을 표시하게하십시오. 예를 들어 'timec'이 1 일 때 '1/44100'은 0입니다. 그리고 그 분단의 결과는'timec '이 44100의 값에 도달 할 때까지 0이 될 것입니다. Sp, 첫번째 44100 샘플은'sin (0)'으로 계산 될 것입니다. 그것이 C++가 작동하는 방식입니다. –

+0

@SamVarshavchik timec은 부동 소수점이므로 자동으로 결과를 홍보해서는 안됩니까? –

+0

여기서'timec'은 float입니까? 표시된 코드에서'timec'의 선언은 주어지지 않았고,'int'로 추정됩니다. –

답변

0

내 질문에 답해주세요.

Rtaudio는 까다로운 방식으로 출력 버퍼를 처리합니다. float 배열은 단일 모노 채널이 아니며 각 채널에 대해 하나의 프레임을 나타내는 슬롯을 포함하고 다음 프레임에 대해 여러 슬롯이 뒤 따른다.이 출력에는 2 개의 채널이 있기 때문에 키 보정은 다음과 같습니다.

outputbuffer[2 * i] = v;

하나의 채널로 출력 할 수 있습니다.