这是我的“周末”爱好问题。
我从经典合成器的ROM中得到了一些广受欢迎的单周期波形。
这些是8位样本(256个可能的值)。
因为它们只有8位,所以本底噪声非常高。这是由于量化误差造成的。量化误差非常奇怪。它稍微扰乱了所有频率。
我想采取这些循环并制作“干净”的16位版本。 (是的,我知道人们喜欢肮脏的版本,所以我会让用户在脏和干净之间插入他们喜欢的程度。)
这听起来不可能,对,因为我永远失去了低8位,对吧?但这已经在我的脑海中停留了一段时间,我很确定我能做到。
请记住,这些是单循环波形,只是反复重复播放,所以这是一种特殊情况。 (当然,合成器会做各种各样的事情来使声音变得有趣,包括信封,调制,滤波器交叉渐变等)。
对于每个单独的字节样本,我真正知道的是它是16位版本中的256个值之一。 (想象一下反向过程,其中16位值被截断或舍入为8位。)
我的评估功能是试图获得最低噪底。我应该能够用一个或多个FFT来判断。
详尽的测试可能需要永远,所以我可以采取较低分辨率的第一次通过。或者我只是随机推送随机选择的值(在保持相同8位版本的已知值内)并进行评估并保持更清洁的版本?还是我能做得更快?当搜索空间中的其他地方可能有更好的最小值时,我是否有陷入局部最小值的危险?我已经在其他类似的情况下发生了这种情况。
我是否可以通过查看相邻值来进行初步猜测?
编辑:有些人指出,如果我删除新波形将采样到原始波形的要求,问题会更容易。确实如此。事实上,如果我只是寻找更清晰的声音,解决方案是微不足道的。
答案 0 :(得分:2)
您可以将现有的8位样本放入新16位样本的高位字节,然后使用低位字节linear interpolate每个原始8位之间的一些新的16位数据点样品。
这将基本上连接每个原始8位样本之间的16位直线,使用几个新样本。它听起来比你现在的安静得多,这是两个原始样本之间突然的8位跳跃。
您也可以尝试应用一些low-pass filtering。
答案 1 :(得分:1)
在你的问题中采用这种方法,我建议你研究爬山算法等。
http://en.wikipedia.org/wiki/Hill_climbing 有关它的更多信息,并且sidebox与其他算法的链接可能更合适。
人工智能就像炼金术一样 - 我们从来没有达到最终目标,但很多好东西都出现了。答案 2 :(得分:1)
好吧,我希望有一些FIR滤波(IIR,如果你真的需要处理周期,但FIR可以提供更好的结果而不会出现不稳定性)来清除噪声。您必须使用它才能获得所需的效果,但基本问题是通过以8位分辨率对其进行采样来平滑音频中的锐利边缘。我会广泛宣传音频的中心频率并做一个低通滤波器,然后听我确保我没有用我选择的滤波器让它听起来“平坦”。
虽然很难,但是你可以做的很多,低8位会丢失,你能做的最好就是接近它。
几乎不可能摆脱看起来像你的信号的噪音。如果您开始在您的频段中调整内容,它将会删除感兴趣的信号。
对于上采样,由于您已经在使用FFT,因此可以在频域信号的末尾添加零并进行反向FFT。这完全保留了原始信号的频率和相位信息,尽管它在更多样本上传播相同的能量。如果你将它的8位移动到16位样本,那么这不会是一个太大的问题。但在进行变换之前,我通常会用整数增益因子将其激活。
皮特
编辑: 评论有点长,所以我会找一些答案。
FFT输出中的峰值是由量化引起的谐波尖峰。我倾向于认为它们与本底噪声不同。您可以像有人提到的那样抖动并消除谐波尖峰的振幅并使噪声基底平坦,但是您可以在噪声基底的平坦部分上消除所有信号噪声。就FFT而言。当您使用该方法进行插值时,它会保留相同的能量并在更多样本上传播,这会降低幅度。因此,在进行反演之前,通过乘以增益系数为信号提供更多能量。
信号是简单/复杂的正弦曲线,还是它们有硬边?即三角形,方波等。我假设它们在循环之间具有连续性,是否有效?如果是这样,您还可以通过增加馈送到FFT的波形周期数来提高FFT分辨率,从而更精确地定位频率。如果您可以精确地识别频率使用,假设它们有点离散,您可以完全重建预期的信号。
16位到8位的截断要求将产生与原始源不匹配的结果。 (因此,找到最佳答案更加困难。)通常,您会通过尝试“获得最接近的匹配”来生成固定点波形,这意味着舍入到最接近的数字(中继是地板操作)。这很可能是他们最初生成的原因。添加0.5(在这种情况下0.5为128)然后中继输出将允许您生成更准确的结果。如果这不是一个担心,那么好,但它肯定会对准确性产生负面影响。
更新: 为什么?因为采样信号的目标是能够尽可能接近地再现信号。如果在采样时设置的转换阈值很差,则所有错误都是信号的一侧而不是很好地分布并且以零为中心。在这样的系统上,您通常会尝试最大限度地利用可用的动态范围,特别是如果您具有低分辨率,例如8位ADC。
乐队限量版?如果它们以不同的频率进行过滤,我怀疑当你离另一个变化太远时,允许你播放相同的声音而没有失真。有点像图形中的mipmapping。 我怀疑两个是相同的信号,应用了不同的混叠滤波器,这可能有助于再现原始。它们应该是相同的基本信号,并应用不同的卷积。
答案 3 :(得分:1)
可能有一种简单的方法可以利用波形的周期性。如果你这样:
制作一个16位波形,其中高字节为波形,低字节为零 - 称之为x [n]。
计算x [n] = X [w]的离散傅里叶变换。
发信号Y [w] =(dBMag(X [w])>阈值)? X [w]:0,其中dBMag(k)= 10 * log10(real(k)^ 2 + imag(k)^ 2),并且阈值可能是40 dB,基于8位大约48 dB动态范围,并允许~1.5位的噪音。
逆变换Y [w]得到y [n],即新的16位波形。
如果y [n]听起来不太好,请用一些非常低的噪音来抖动它。
注意:
一个。这种技术只适用于原始波形是完全周期性的!
B中。步骤5可能会被替换为在步骤3中将“0”值设置为Y [w]中的随机噪声,您需要进行一些实验以了解哪些更有效。
这似乎比优化方法更容易(至少对我而言)。但截断的y [n]可能不等于原始波形。我不确定这种约束有多重要。我觉得这种方法会生成听起来不错的波形。