【问题标题】:How to add noise to a PCM raw data如何在 PCM 原始数据中添加噪声
【发布时间】:2013-04-16 18:26:32
【问题描述】:

现在我有一个直接从 WAV 文件加载的 PCM 原始字节数组,现在我必须将噪声添加到原始字节数组中。我的要求是在不知道添加噪声的情况下无法解码结果,如果我确切知道噪声是什么,我也可以去除噪声。 我目前的想法是将原始字节数组转换为短数组,并生成一个噪声短数组,其随机生成数在 2^-15 和 2^15 之间,并逐个插槽添加这两个数组。但是看起来这种方法不能保证我可以恢复原始数组。 有人可以给我一些更好的想法吗?提前谢谢你。

【问题讨论】:

    标签: java android signal-processing


    【解决方案1】:

    假设你有一个(声音)信号,S(t)。

    你想“加密”这个信号,创建 E(t)。

    您可以通过添加噪声 N(t) 来做到这一点。

    S(t) + N(t) = E(t)。

    此外,E(t) - N(t) = S(t)。

    所以现在的问题是产生一种独特的“噪音”。

    我会通过一个伪随机数生成器 (http://en.wikipedia.org/wiki/Pseudorandom_number_generator) 来执行此操作,您可以在其中将种子信息传递给接收者。

    现在,任何拥有相同种子来创建 N(t) 的人都可以计算 E(t)-N(t)=S(t)


    对 cme​​ts 的回应:

    @Bjorn:这不是一般意义上的加密。但是,假设你有一些整数 C mod [0 - 2^16-1]。现在,在相同的范围 [0-2^16-1] 上添加一些统一的随机整数。结果也是该范围内的均匀随机整数。因此,根据随机序列生成器的质量,您可以创建不可解码的信号(没有原始叠加信号)。 (我承认,如果没有溢出,情况就不会如此)。

    @OP:您的问题是在传递数字后对其进行解码。

    假设您有一个二进制字符串 10101010。现在,您将 11110000 添加到此。 结果应该类似于 01011010。溢出到第 2^8 位。

    现在,01011010 - 11110000 返回相同的初始值:10101010。所以这个溢出实际上有助于屏蔽原始信号

    *前提是您使用了一个独特的掩蔽信号,您可以在接收方再次生成该信号。

    【讨论】:

    • 一些事情: 1. 声音不会真正被加密(在任何意义上)。一方面,您仍然可以分辨出原始声音是什么。 2. 你需要考虑音频格式。 OP 建议从字节转换为短裤。如果您的平台上的 WAV 文件是 16 位并且短裤是 16 位(通常是),这将起作用。
    • @Bjorn 问题是:如果我将一个随机值添加到一个短值中,结果可能大于短值的最大值 2^15-1,如果发生这种情况,我可能不会取回原来的值。
    【解决方案2】:

    根据定义,噪声是信号中的(准)随机干扰。您无法完全恢复原始信号,只有在您知道噪声频谱的情况下才能抑制它。

    【讨论】:

      猜你喜欢
      • 2019-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-27
      • 2021-01-12
      相关资源
      最近更新 更多