8 位音频样本到 16 位

Posted

技术标签:

【中文标题】8 位音频样本到 16 位【英文标题】:8 bit audio samples to 16 bit 【发布时间】:2010-11-15 06:18:06 【问题描述】:

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

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

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

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

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

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

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

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

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

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

我可以通过查看相邻值做出初步猜测吗?


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

【问题讨论】:

我绝不是 DSP 专家,但通过简短的搜索 (google.com/search?&q=improve++audio++bit+rate) 找到了一些论文:www2.computer.org/portal/web/csdl/doi?doc=abs/proceedings/icme/…、iwaenc05.ele.tue.nl/proceedings/papers/S04-02.pdf。也许这会给你下周末的一些想法;-) 谢谢迪沃!我会读那些。 我发现的大多数论文都在谈论低采样率。只有少数人谈论从量化误差中恢复。我还没有决定是否考虑采样率错误,因为我已经有了一个很好的音频质量插值器。 有一些文献带有关键字:位深度扩展 【参考方案1】:

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

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

您也可以尝试申请一些low-pass filtering

【讨论】:

这是我做的第一件事。 ;-) 首先我尝试了线性,然后我改用了更好的方法。它做了一点清洁,只是因为当你在样品之间敲击它时效果更好。它比 raw 稍微好一点,但并没有真正解决由于量化误差而导致点在错误位置的事实。 也许我的建议是错误的,但不是提高采样率而不是提高信噪比吗? 同样,低通确实可以消除高噪声,但不能帮助信号顶部以下的噪声。当然,它会影响相位。基本上,所有这些旧合成器都有低通。我真的在这里追求量化误差的核心。 :-) 但感谢您的建议。 我认为这只会有助于对波形进行上采样,而不是将其保持在相同的采样率并且只是增加采样大小。 divo,无论如何,我愿意添加示例槽并通过数据进行更高的移动来补偿。所以这并不重要。【参考方案2】:

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

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

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

【讨论】:

这正是我想要的。我通常的策略是每次通过 I 1) 选择要改变的数字。 2) 为每个人确定一个随机的移动范围。 3)在该范围内生成一个随机数。 4) 进行评估并决定是否从那里重新开始。这通常让我远离本地分钟。【参考方案3】:

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

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

几乎不可能消除看起来像您的信号的噪音。如果您开始在您的频段内调整内容,它将取出感兴趣的信号。

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

皮特

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

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

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

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

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

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

【讨论】:

幸运的是,看一下信号,在大多数情况下很明显——噪音看起来不像他发出的信号。我意识到我无法恢复实际信号,但我会很高兴将本底噪声降低到可听范围之外。我知道我可以进行逆FFT。我的目标是能够将 16 位样本除以 256,并获得与我开始时相同的数据。这就是为什么我担心逆 FFT。你能解释一下你所说的关于需要提高收益的最后一件事吗?我没听懂你的意思。 我的想法是,我得到的 任何 16 位结果可以被截断为 8 位原始周期是“有效的”,因为它是一个可能的输入.但是有清晰的(-ish)信号峰值被这层噪声包围,而这些噪声在录制的声音中并不存在。我知道这是因为对那个时代的合成器制造商的采访,他们在负担得起的时候就转向了 12 位和 16 位 DAC。 量化没有峰值。至少不要太多,也不要太高。它真的更像是一个噪音地板。我已经完成了位破碎机和量化效果,所以我对你得到的噪音非常熟悉。对于我拥有的样本,具有硬边沿的波形通常具有第二个带限版本,可在更高的寄存器中使用。我不知道足够的历史来知道它们是如何创建的。如果我沿着逆 FFT 路径走下去,我仍然会确保我可以通过取高位字来从 16 位到 8 位。这是一个要求。 是的,bandlimited 版本很像 mipmapping。这是一个很好的类比。您可以使用它们演奏更高的音符而不会出现混叠。 为什么您认为采样器是圆形的而不是底部的?模数转换不只是累积电压或其他东西,直到下一个脉冲出现?诚然,从模拟到数字的整个过程并不是我的强项,但我有 DSP 书籍来解释一些采样器的工作原理。【参考方案4】:

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

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

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

    制作一个信号 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 位噪声。

    对 Y[w] 进行逆变换得到 y[n],即您的新 16 位波形。

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

注意事项:

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

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

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

【讨论】:

约束是至关重要的。我希望能够拥有可以采样到 8 位并匹配的波形。否则问题很简单。不过我会考虑的。 也许你可以做一个优化方法,使成本函数最小化 |y[n] - x[n]| + |Y[w]|,搜索空间是 Y[w] 的“0”值。 |y[n] - x[n]|成本函数的一部分将保持 y[n] 匹配 x[n] 的高位,并且 |Y[w]|部分将本底噪声推低。我不知道优化将如何处理搜索空间和成本函数之间的傅里叶逆变换,我对优化技术的经验很少。

以上是关于8 位音频样本到 16 位的主要内容,如果未能解决你的问题,请参考以下文章

处理 16 位样本音频

混合 PCM 音频样本

如何将 wav 音频文件格式(样本宽度)转换为 8 位格式?

音频处理 音频文件

AudioRecord:每个样本的位数

从幅度样本创建音频文件