【问题标题】:Wav file noise removalWav 文件去噪
【发布时间】:2013-03-24 09:56:14
【问题描述】:

我正在编写一个程序(c++,vs2010,win7),将音频记录到 wav 文件中。 当我尝试听到音频时,它有很多白噪声。 我试图用我写的另一个程序重新打开文件。这个程序唯一做的就是:

Char buffer[8000*60*2] = {} 
File *wav, *out
Wav = fopen ("raw", "r+") 
Out = fopen("out", "a+") 
fread(buffer, sizeof (char) *8000*60*2,1,wav)
fwrite(buffer, sizeof (char) *8000*60*2,1,out) 
fclose (wav) 
fclose (out) 

在我通过这个程序传递原始数据后,我可以听到原始 wav 文件的一小部分没有任何噪音(我大胆地打开它作为原始数据)。 我的问题是我没有更改数据中的任何内容,只是再次写入它,就像我能清楚地听到的魔法一样。 我错过了什么? 我没有对数据进行任何更改。 当我写数据时,我把它写成一个短变量。 数据短 fwrite(数据, 1024,1,wav)

【问题讨论】:

  • 您意识到您正在附加到该输出文件,而不是重写它?
  • 是的,无论如何它都是一个新文件。我可以将其更改为 w+,但结果相同
  • 那么如果你只使用资源管理器复制文件,你会得到同样的效果吗?
  • 我得到和 wav 文件一样的噪音
  • 好的,所以你的程序产生了一些差异。如果您没有更改默认值,它应该以二进制方式读取/写入,但您可以尝试将“rb”和“wb”作为文件模式。

标签: c++ audio-streaming wav pcm


【解决方案1】:

在编写 WAVE 文件时,很多事情都可能导致它产生噪音。以下是您应该寻找的几件事:

限制值

vanilla WAVE 文件具有 16 位数据值(如果是立体声,则为两个值),因此如果您放大,您必须确保所有值都在 (32768, -32768) 范围内值并且它们超过该限制,那么您将获得一个随机*值,因此在写入文件时会产生噪音。

二进制写入

正如 Roger 在原始问题的 cmets 中所提到的,以二进制形式编写很重要,因为如果您尝试使用标准“r”写入文件,您只会得到很多白噪声。

缺少标题

有时,如果您忘记了标题,您也可能会在输出 WAVE 文件中出现噪音。

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-24
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    • 2021-03-04
    • 2011-11-11
    • 1970-01-01
    相关资源
    最近更新 更多