我对信号非常陌生,我正在尝试根据数据库中的一些参数生成声音。因此,数据库存储以下内容:
- 开始频率
- 结束频率
- 起始振幅
- 结束幅度
- 期间
我正在使用以下代码根据此信息生成 WAV 文件:
...
double currentFrequency;
double currentAmplitude;
int samplerate = 44100;
int samples = ceil(duration * samplerate);
int* mySampleBuffer = new int[samples];
for(int i=0; i<samples; i++)
{
currentFrequency = Interpolate(i, 0, samples, startFrequency, endFrequency);
currentAmplitude = Interpolate(i, 0, samples, startAmplitude, endAmplitude);
mySampleBuffer[i] = static_cast<int>(INT_MAX * (sin(((double)i * currentFrequency * PI * 2)/(double)samplerate) * (currentAmplitude/maxAmplitude)));
}
writeWAVData("mySound.wav", mySampleBuffer, mySampleBufferSize, samplerate, 1);
delete[] mySampleBuffer;
...
当 currentFrequency 达到 startFrequency 的 1/2 时,我注意到声波翻转(不确定正确的术语是什么)。这似乎不正确。有人可以帮助我了解发生了什么。
这是Audacity的截图
对于此图像,startFrequency 为 3380 Hz,endFrequency = 1380 Hz,持续时间为 0.512 s,幅度从开始到结束是恒定的。我计算出在 0.43264 秒时,currentFrequency 正好是 startFrequency 的 1/2。在图片中,您可以看到“翻转”发生在大约 0.43 秒。