采样率和音符频率

时间:2017-04-16 11:08:02

标签: c++ arduino

如何以44100采样率播放高频率音符

例如 如果我们尝试以44100的采样率创建2959.95538169307680 hz F#7波,那么一个cicle必须由13个样本定义(sampleRate / hz) 问题是如果我们采用下一个注释3135.96348785399680 G7 hz那么这也将是13个样本,因为从十进制转换为int。

似乎不可能以44100采样率产生7个八度以上的累积音符?还是有一些技巧?

样品 - >赫兹

13 2959.95538169307680 F#7

13 3135.96348785399680 G7

2 个答案:

答案 0 :(得分:0)

  

似乎无法使用44100采样率生成7倍频程以上的累积音符

每秒44100采样率,您可以创造高达22Khz的声音,这意味着您可以创建整个人类听觉范围的声音,

https://en.wikipedia.org/wiki/Nyquist_rate

在13个周期中创建它是什么意思?请注意,您考虑的音符(或频率)是无理数,因此不会在13个周期内重复。它们不会在数千位长的信号序列中重复。 (考虑它就像数字pi)

答案 1 :(得分:0)

44.1k的采样率意味着您只能生成最多22.05k的音符(这就是所谓的Nyquist frequency)。您通常使用超过13个样本的wavetable,例如256或1024甚至更大(在我的合成器中,我每个波形使用4096个32位样本)。

假设您有一个包含1024个正弦波值的数组。然后,要生成例如3000 Hz的频率,您将逐步执行此数组,步长为1024 * 3000.0 / 44100.0 = 69.65986。所以你从索引0开始,然后下一个将是索引69处的样本,然后是下一个索引(int)2 * 69.65986 = 139,下一个(int)3 *步骤等等。如果你到达结尾数组,你环绕到开头,不断添加你为给定频率计算的步骤。

这样做,这将从阵列中的1024个中挑选出13个或14个样本,但在每个循环中不会选择相同的样本。

如果你想在不产生泛音的情况下这样做,你可能不得不使用过采样并为不同的频率范围生成不同的波表,其中高频率的波形被过滤(例如使用FFT,去除上面的频率奈奎斯特,然后做反向FFT)去除泛音。

这不是一个简单的主题。但仅仅拥有13个样本的表是不够的。这听起来不对,你不能像你已经注意到的那样可靠地产生一个合适的频率。

在网络上有关于数字信号处理(和生成)的很多材料。在像这样的简单Q& A媒介中,无法深入讨论它。