【发布时间】:2016-05-01 03:12:28
【问题描述】:
在开展一个项目时,我遇到了准确地生成各种波浪的需求。我认为简单的正弦波最容易开始,但似乎我错了。我做了一个简单的程序,它生成一个vector 的样本,然后播放这些样本,以便用户听到波形,作为测试。以下是相关代码:
vector<short> genSineWaveSample(int nsamples, float freq, float amp) {
vector<short> samples;
for(float i = 0; i <= nsamples; i++) {
samples.push_back(amp * sinx15(freq*i));
}
return samples;
}
我不确定这是什么问题。我知道由shorts 组成的向量可能存在一些问题,但这正是我的音频框架想要的,我对这种库没有经验,所以不知道会发生什么。
症状如下:
- 频率不正确
- 即:给定 freq=440,A4 不是播放的音符
- 奇怪的失真
- 大多数频率不会产生干净的波。 220、440、880 都是干净的,其他大多数都是失真的
- 大部分频率大幅上移
任何人都可以就我可能做错的事情提供建议吗?
这是我迄今为止尝试过的:
- 制作我自己的正弦函数,以获得更高的精度。
- 我对 sin(x) 使用了 15 次泰勒级数展开
- 更改了采样率,从 256 更改为 44100,由于上述错误,听不到任何变化,只是波形更加失真。
谢谢。如果有任何信息可以帮助您,我有义务提供。
【问题讨论】:
-
最好把
i改成int,很可能它不会解决任何问题,但会更快 -
sinx15是做什么的? -
@EdHeal,我应该提到,
sinx15是我的 15 次泰勒多项式正弦逼近。 -
什么是频率参数?每个周期至少需要两个样本才能获得无锯齿波。您可能忘记了 2pi 术语。 “频率”是作为欧米茄(2 * pi *频率)传递还是只是普通频率?此外,你实现它的方式你会想要 i / frequency 或类似的东西。
-
@Slava,会的。我认为最终可能会出现类型转换问题
标签: c++ math trigonometry