我正在使用 ST 板生成一个简单的乐器。基本上我有一个传感器,它可以检测运动或空间角度,并根据角度产生不同音高和音量的声音。我已经有了音频编解码器的驱动程序,所以我需要做的就是生成声音样本并将样本提供给它。现在我能够从传感器获得角度读数,但具有挑战性的部分是如何产生声音。到目前为止,从谷歌搜索来看,我认为我需要根据传感器的读数生成一个频率和幅度(音量)设置的 sin 函数。但是我的编解码器假设采样率为 0f 48KHz 那么我将如何为固定采样率生成具有不同频率的正弦曲线呢?
到目前为止,我已经这样做了:
samplingRate = 48000;
n = 0; // reset once there is a change in frequency
// this function is called 48000 times a second
int generateSineWave(float frequency, float volume)
{
int temp = volume*(sin(2*pi*frequency*n);
n = n + 1;
if (n == samplingRate) {
n = 0;
}
if (abs(temp) > MAXVAL) {
return ERROR_CODE;
}
return temp;
}
这似乎有效(我听到了一些声音),但我不确定它是否产生了正确的频率正弦曲线。我听到的声音也不是很悦耳,我将如何产生复杂的音调(例如钢琴中的音调)?我想我的控制变量(空间角度)也需要低通滤波。但除此之外,关于如何产生更悦耳的波浪的任何想法?