我正在尝试产生声卡的音调(频率: 1950赫兹,持续时间: 40毫秒,电平:-30分贝,右声道(立体声),蒸汽1)。最后,我想播放其中的两个音调(一个去频道1,一个去频道2)。
任何帮助或指导都是非常感谢的。
谢谢你,DW
嗨,比约恩,我试过这个,但我没有得到我期望的频率(加上声音似乎不干净)。有什么好主意吗?我非常感谢任何帮助。
#define SAMPLE_RATE (44100)
#define TABLE_SIZE (200)
float FREQUENCY = 422;
...
for(int i=0; i<TABLE_SIZE; i++ )
{
data.sine[i] = (float) sin( (double)i * ((2.0 * M_PI)/(double)SAMPLE_RATE) * FREQUENCY );
}
data.left_phase = 0;
data.right_phase = 0;
...
... in callback function ...
for(unsigned long i = 0; i < framesPerBuffer; i++ )
{
// fill output buffer with sin wave
*out++ = data->amp * data->sine[data->left_phase]; // left
*out++ = data->amp * data->sine[data->right_phase]; // right
data->left_phase += 1;
if( data->left_phase >= TABLE_SIZE )
data->left_phase -= TABLE_SIZE;
data->right_phase += 1;
if( data->right_phase >= TABLE_SIZE )
data->right_phase -= TABLE_SIZE;
} 发布于 2012-09-28 02:20:41
PortAudio有生成音调的示例代码,您只需要计算出频率。例如,见以下答案:
[portaudio]Transmit and Detect frequency - Windows
更新:
与其试图存储正弦数据表,不如使用以下公式计算回调中的正弦值:
振幅= sin( n* desiredFreq *2* pi /样品)
所以(未经测试的)代码如下所示:
typedef struct
{
long n;
} MyData;
float FREQUENCY = 422;
static int MyCallback(
const void *inputBuffer,
void *outputBuffer,
unsigned long framesPerBuffer,
const PaStreamCallbackTimeInfo* timeInfo,
PaStreamCallbackFlags statusFlags,
void *userData
)
{
MyData *data = (MyData*)userData;
float *out = (float*)outputBuffer;
(void) timeInfo; /* Prevent unused variable warnings. */
(void) statusFlags;
(void) inputBuffer;
for(unsigned long i = 0; i < framesPerBuffer; i++ )
{
// fill output buffer with sin wave
float v = sin( data->n * FREQUENCY * 2 * PI / (float) SAMPLERATE )
*out++ = v; // left
*out++ = v; // right
}
return paContinue;
}这段代码并非没有问题。最终,n将“包围”,我不确定当输入变得更大时,sin是否保持准确和有效。尽管如此,这是一个很好的起点,如果你只需要在现代硬件上产生几秒钟的音调,这就是你所需要的。如果你需要一些更时尚的东西,首先让它发挥作用,那么你可以担心使用LUT会使它更高效、更健壮。
https://stackoverflow.com/questions/12612951
复制相似问题