Audio 无混叠伪影的采样波形的高效生成
对于我的一个项目,我正在使用采样声音生成,我需要在不同频率下创建各种波形。当波形为正弦时,一切正常,但当波形为矩形时,就会出现问题:它听起来好像来自80年代,随着频率的增加,音符听起来就错了。在第八个八度音阶上,每个音符听起来都像是某个较低八度的随机音符 无论我是否使用以下两种方法之一,不良效果都是相同的:Audio 无混叠伪影的采样波形的高效生成,audio,signal-processing,sampling,waveform,Audio,Signal Processing,Sampling,Waveform,对于我的一个项目,我正在使用采样声音生成,我需要在不同频率下创建各种波形。当波形为正弦时,一切正常,但当波形为矩形时,就会出现问题:它听起来好像来自80年代,随着频率的增加,音符听起来就错了。在第八个八度音阶上,每个音符听起来都像是某个较低八度的随机音符 无论我是否使用以下两种方法之一,不良效果都是相同的: 生成矩形波形的纯数学方法为sample=sign(secondsPerHalfWave-(timeSeconds%secondsPerWave))其中secondsPerWave=1.0/
- 生成矩形波形的纯数学方法为
其中sample=sign(secondsPerHalfWave-(timeSeconds%secondsPerWave))
和secondsPerWave=1.0/wavesPerSecond
secondsPerHalfWave=secondsPerWave/2.0
- 我比较喜欢的方法是,用线段来描述波的一个周期,并沿着这些线段进行插值。因此,矩形波形由y=1.0时x=0到x=0.5的水平线描述(与采样率和频率无关),然后是y=-1.0时x=0.5到x=1.0的另一条水平线
sin()
和cos()
之后。)此外,当我看到生成的波形时,它们看起来非常复杂,所以我想知道它们是否可以被合理地称为矩形
所以,我的问题是:
生成周期性波形(如矩形波形)的计算效率最高的方法是什么
解决方案可能包含的示例:
我是一个程序员,而不是一个声音工程师,在我的小程序员的世界里,事情很简单:我有一个样本数组,所有样本都必须在-1.0和1.0之间,并且将以一定的速率播放(每秒44100个样本)。我有算术运算和三角函数供我使用,我可以描述直线,使用简单的线性插值,我需要非常高效地生成样本,因为同时生成十几个波形以及将它们混合在一起可能不会消耗超过总CPU时间的1%。我不确定,但您可能对混叠的性质有一些误解。我是根据你引用的术语,并从以下引用: 当我看到生成的 波形是指每秒采样数的值不是精确的倍数 每秒波数的值,所以每个波没有偶数 样本数,这反过来意味着 级别1.0通常不等于级别-1.0的样本数 采样/秒和波/秒根本不必是精确的倍数!一个人可以在奈奎斯特下重放所有投球。所以我不清楚你是怎么想的 方波的特征声音来自奇数谐波的存在,例如,对于440(A5)音符,方波声音可以通过组合440、1320、2200、3080、3960等正弦以880的增量产生。这就引出了一个问题:有多少个奇次谐波?从理论上讲,我们可以到无穷大
int main() {
UserData ud;
sp_data *sp;
sp_create(&sp);
sp_ftbl_create(sp, &ud.ft, 2048);
sp_osc_create(&ud.osc);
sp_gen_sine(sp, ud.ft);
sp_osc_init(sp, ud.osc, ud.ft);
ud.osc->freq = 500;
sp->len = 44100 * 5;
sp_process(sp, &ud, write_osc);
sp_ftbl_destroy(&ud.ft);
sp_osc_destroy(&ud.osc);
sp_destroy(&sp);
return 0;
}