我用Java编写了一个世嘉主机模拟器(虽然这个问题与Java无关),除了SN76489声音芯片外,我已经完成了一切。这个芯片如何发出声音很容易,但我的问题是将其转换为可在电脑/笔记本电脑/JVM运行的设备上播放的形式。
我已经确定了以下步骤:
由于SN76489以大约221khz的采样率运行,这意味着它输出的波形的频率高达110khz(尽管实际上我怀疑任何东西都不会这么高)。因此,在我对其进行下采样之前,我需要先实现一个低通滤波器。
接下来,我想将其下采样到44.1khz,以便可以通过音频线输出它(在我的情况下,是Java Source Data Line)。
为此,我需要将低通滤波器设置为22.05khz,但问题在于我不知道(数学上说)低通滤波器实际上是如何工作的。我需要这样做才能编写一个。
目前,我的声音芯片创建一个0.2秒缓冲区,并在其中存储样本,采样率为221khz,如上所述。 我可以进行下采样,但如果没有先应用低通滤波器进行下采样,我了解到结果的声音流中可能会产生混叠故障。
有人可以为此推荐最简单的数学算法吗?我知道由于涉及到的变量,低通滤波器永远不是“精确”的,但我只需要一个足够简单的、为我的大脑(在这之前根本没有处理过波形处理)准备的合理解释。
如果有帮助的话,具体内容如下:
SN76489同时输出三个方波和一个噪声信道。它们被加在一起,输出到混频器/放大器 - 在该链的这个阶段,我想在下采样并放大波形之前运行低通滤波器。任何人能给我提供帮助将不胜感激。我意识到需要背景知识,但我想知道应该阅读什么。非常感谢。
更新:最终我想出了一种更简单的方法-尽管还没有完全实现。 SN76489通过从寄存器值生成每个音调信道来工作-输出1的极性,值递减,以此类推-直到值为0,然后重置该值并将极性切换为-1,以此类推。然后将该值乘以音量以获得该样本的最终振幅,并与其他通道相加。
我现在阻止产生超过我需要的奈奎斯特限制之上的方波寄存器值。这让我得到了一个更好的信号,但它仍然有一些嗡嗡声/爆音 - 不确定为什么,因为最大可能的频率应该是18,473Hz。这种爆鸣声是不是因为当芯片从一个频率切换到另一个频率时,它不允许当前的波形完全完成呢?举个例子,芯片输出1111,然后是00 - 而不是完整的四个零并切换到新的频率 - 这可能会导致混叠现象,对吗?
我已经确定了以下步骤:
由于SN76489以大约221khz的采样率运行,这意味着它输出的波形的频率高达110khz(尽管实际上我怀疑任何东西都不会这么高)。因此,在我对其进行下采样之前,我需要先实现一个低通滤波器。
接下来,我想将其下采样到44.1khz,以便可以通过音频线输出它(在我的情况下,是Java Source Data Line)。
为此,我需要将低通滤波器设置为22.05khz,但问题在于我不知道(数学上说)低通滤波器实际上是如何工作的。我需要这样做才能编写一个。
目前,我的声音芯片创建一个0.2秒缓冲区,并在其中存储样本,采样率为221khz,如上所述。 我可以进行下采样,但如果没有先应用低通滤波器进行下采样,我了解到结果的声音流中可能会产生混叠故障。
有人可以为此推荐最简单的数学算法吗?我知道由于涉及到的变量,低通滤波器永远不是“精确”的,但我只需要一个足够简单的、为我的大脑(在这之前根本没有处理过波形处理)准备的合理解释。
如果有帮助的话,具体内容如下:
SN76489同时输出三个方波和一个噪声信道。它们被加在一起,输出到混频器/放大器 - 在该链的这个阶段,我想在下采样并放大波形之前运行低通滤波器。任何人能给我提供帮助将不胜感激。我意识到需要背景知识,但我想知道应该阅读什么。非常感谢。
更新:最终我想出了一种更简单的方法-尽管还没有完全实现。 SN76489通过从寄存器值生成每个音调信道来工作-输出1的极性,值递减,以此类推-直到值为0,然后重置该值并将极性切换为-1,以此类推。然后将该值乘以音量以获得该样本的最终振幅,并与其他通道相加。
我现在阻止产生超过我需要的奈奎斯特限制之上的方波寄存器值。这让我得到了一个更好的信号,但它仍然有一些嗡嗡声/爆音 - 不确定为什么,因为最大可能的频率应该是18,473Hz。这种爆鸣声是不是因为当芯片从一个频率切换到另一个频率时,它不允许当前的波形完全完成呢?举个例子,芯片输出1111,然后是00 - 而不是完整的四个零并切换到新的频率 - 这可能会导致混叠现象,对吗?