6

这是我的“周末”爱好问题。

我从经典合成器的 ROM 中获得了一些深受喜爱的单周期波形。

这些是 8 位样本(256 个可能的值)。

因为它们只有 8 位,所以本底噪声非常高。这是由于量化误差。量化误差非常奇怪。它使所有频率有点混乱。

我想利用这些周期并制作它们的“干净” 16 位版本。(是的,我知道人们喜欢脏版本,所以我会让用户在脏和干净之间插入他们喜欢的任何程度。)

这听起来不可能,对吧,因为我已经永远失去了低 8 位,对吧?但这在我脑海里已经有一段时间了,我很确定我能做到。

请记住,这些是单周期波形,会一遍又一遍地重复播放,所以这是一种特殊情况。(当然,合成器会做各种各样的事情来让声音变得有趣,包括包络、调制、滤波器交叉淡入淡出等)

对于每个单独的字节样本,我真正知道的是它是 16 位版本中的 256 个值之一。(想象一下相反的过程,其中 16 位值被截断或舍入为 8 位。)

我的评估功能是试图获得最小的本底噪声。我应该能够通过一个或多个 FFT 来判断这一点。

详尽的测试可能需要很长时间,所以我可以先通过较低分辨率的测试。还是我只是随机推送随机选择的值(在保持相同 8 位版本的已知值内)并进行评估并保持更清晰的版本?或者有什么更快的我可以做的吗?当搜索空间的其他地方可能有更好的最小值时,我是否有陷入局部最小值的危险?我在其他类似的情况下也遇到过这种情况。

有没有我可以做出的初步猜测,也许是通过查看相邻值?


编辑:有几个人指出,如果我取消新波形采样到原始波形的要求,问题会更容易。确实如此。事实上,如果我只是在寻找更干净的声音,那么解决方案是微不足道的。

4

4 回答 4

2

您可以将现有的 8 位样本放入新 16 位样本的高位字节,然后使用低位字节在每个原始 8 位样本之间 线性插值一些新的 16 位数据点。

这实际上将使用几个新样本在每个原始 8 位样本之间连接一条 16 位直线。听起来会比现在安静得多,这是两个原始样本之间突然的 8 位跳跃。

您也可以尝试应用一些低通滤波

于 2009-07-29T22:43:10.880 回答
1

使用您问题中的方法,我建议您研究爬山算法等。

http://en.wikipedia.org/wiki/Hill_climbing 有更多关于它的信息,并且侧边框有链接到其他可能更合适的算法。

人工智能就像炼金术——我们从未达到最终目标,但一路上出现了很多好东西。

于 2009-07-30T12:50:26.767 回答
1

好吧,我希望一些 FIR 滤波(如果你真的需要处理周期,IIR,但 FIR 可以提供更好的结果而不会不稳定)来清理噪声。您必须使用它来获得所需的效果,但基本问题是以 8 位分辨率采样创建的音频中的锐利边缘平滑。我会广泛地产生音频的中心频率并进行低通滤波器,然后听以确保我没有使用我选择的滤波器使其听起来“平坦”。

不过这很难,你能做的只有这么多,低 8 位丢失了,你能做的最好的就是近似它。

几乎不可能摆脱看起来像您的信号的噪声。如果您开始在您的频带中调整内容,它将取出感兴趣的信号。

对于上采样,由于您已经在使用 FFT,您可以在频域信号的末尾添加零并执行逆 FFT。这完全保留了原始信号的频率和相位信息,尽管它将相同的能量传播到更多样本上。如果您先将其 8 位转换为 16 位样本,这不会是一个太大的问题。但我通常在进行转换之前将其提升一个整数增益因子。

皮特

编辑:评论有点长,所以我会移动一些答案。

FFT 输出中的峰值是由量化引起的谐波尖峰。我倾向于认为它们与本底噪声不同。您可以像有人提到的那样进行抖动并消除谐波尖峰的幅度并使本底噪声变平,但是您会在本底噪声的平坦部分失去所有信噪比。就 FFT 而言。当您使用该方法进行插值时,它会保留相同的能量并分布在更多样本上,这会降低幅度。因此,在进行逆运算之前,通过乘以增益因子来为您的信号提供更多能量。

信号是简单/复杂的正弦曲线,还是有硬边?即三角波、方波等。我假设它们从一个周期到另一个周期具有连续性,这有效吗?如果是这样,您还可以通过增加馈送到 FFT 的波形周期数来提高 FFT 分辨率以更精确地确定频率。如果您可以精确识别所使用的频率,假设它们有些离散,则您可以完全重新创建预期信号。

16 位到 8 位通过截断要求将产生与原始源不匹配的结果。(从而使找到最佳答案变得更加困难。)通常,您会通过尝试“获得最接近的匹配”来产生定点波形,这意味着四舍五入到最接近的数字(中继是一种地板操作)。这很可能是它们最初的生成方式。添加 0.5(在这种情况下 0.5 是 128)然后对输出进行中继可以让您生成更准确的结果。如果这不是一个担心,那么好的,但它肯定会对准确性产生负面影响。

更新:为什么?因为对信号进行采样的目标是能够尽可能接近地再现信号。如果在采样上设置的转换阈值很差,那么您的错误就是信号的一侧并且分布不均并且以零为中心。在这样的系统上,您通常会尝试最大限度地利用可用的动态范围,特别是如果您的分辨率较低,例如 8 位 ADC。

乐队限定版?如果它们在不同的频率下被过滤,我怀疑这是为了让你在与其他变体相差太远时播放相同的声音而不会失真。有点像图形中的 mipmapping。我怀疑这两个是应用了不同混叠滤波器的相同信号,这可能有助于重现原始信号。它们应该是应用了不同卷积的相同基本信号。

于 2009-07-30T12:59:04.423 回答
1

可能有一种利用波形周期性的简单方法。如果你怎么办:

  1. 制作一个 16 位波形,其中高字节为波形,低字节为零 - 称之为 x[n]。

  2. 计算 x[n] = X[w] 的离散傅里叶变换。

  3. 制作一个信号 Y[w] = (dBMag(X[w]) > Threshold) ?X[w] : 0,其中 dBMag(k) = 10*log10(real(k)^2 + imag(k)^2),阈值可能为 40 dB,基于大约 48 dB 动态范围的 8 位,并允许约 1.5 位噪声。

  4. 逆变换 Y[w] 得到 y[n],你的新 16 位波形。

  5. 如果 y[n] 听起来不太好,请用一些非常低的噪音对其进行抖动。

笔记:

A. 这种技术只适用于原始波形是完全周期性的!

B. 步骤 5 可能会替换为在步骤 3 中将 Y[w] 中的“0”值设置为随机噪声,您必须进行一些试验才能看到更好的方法。

这似乎比优化方法更容易(至少对我而言)。但截断的 y[n] 可能不等于您的原始波形。我不确定这个约束有多重要。我觉得这种方法会产生听起来不错的波形。

于 2009-07-31T20:34:13.773 回答