如何将字节数组转换为 wav 文件 <OOURAFFT>

Posted

技术标签:

【中文标题】如何将字节数组转换为 wav 文件 <OOURAFFT>【英文标题】:How to convert byte array to wav file <OOURAFFT> 【发布时间】:2011-02-15 19:11:35 【问题描述】:

我想将字节数组转换为 wav 文件

MyAudioFile  *audioFile = [[MyAudioFile alloc]init];
OSStatus result = [audioFile open:@"MySound" ofType:@"wav"];
int numFrequencies=16384;
int kNumFFTWindows=10;  

OouraFFT *myFFT = [[OouraFFT alloc] initForSignalsOfLength:numFrequencies*2 andNumWindows:kNumFFTWindows];
for(long i=0; i<myFFT.dataLength; i++)

    myFFT.inputData[i] = (double)audioFile.audioData[i];    

然后我处理myFFT.inputData[i] 以消除背景噪音,但我不知道如何将myFFT.inputData[i] 转换回wav 文件。

感谢您的帮助。

【问题讨论】:

您的意思是要将其转换回时域吗?如果是,那么您的 fft 库肯定具有用于频谱到时域转换的逆 fft 方法。 (wav文件是音频文件格式的标准,它与从频谱到时域的转换无关) 顺便说一句,“进程myFFT.inputData[i]”是指进行fft转换,对吧...? 是的,我的意思是我想转换回我使用的时域 - (void)doIFFT rdft(self.dataLength, -1, self.inputData, ip, w); self.dataIsFrequency = 否;但我不知道这个过程的结果,我不知道如何将它制作成 wav 文件或播放它。谢谢 myFFT.inputData[i] 不是 FFT 函数转换这是我的项目mediafire.com/?j7f7ibo2481b1h7 【参考方案1】:

如果您使用 FFT 将时域数据转换为频域数据,则可以使用逆 FFT 或 IFFT 将复杂的频域数据转换回时域。

如果你只有一个复数 FFT 例程,那么对于长度为 N 的复数向量 X:

IFFT(X) = scale * complexConjugate(FFT(complexConjugate(X)))

其中比例通常为 1/N、1/sqrt(N) 或 1.0,具体取决于前向 FFT 中使用的比例因子。

请注意,波形文件头还包含通道数您可能需要进行一些数据(去)交错以及数据类型转换。 Endianess 也可能是一个问题,具体取决于您计算机的 ISA。

添加:

假设每个 PCM 样本都有合适的数据类型,并且立体声/单声道有适当的交错,您可以使用规范 .wav (RIFF) 文件格式的此描述来添加/删除 44 字节的标头: WAVE PCM soundfile format

【讨论】:

谢谢 hotpaw2 我使用了来自 "github.com/alexbw/iPhoneFFT" 的源代码,并且在文件 "OouraFFT.m" 中具有功能 - (void)doIFFT rdft(self.dataLength, -1, self.inputData, ip, w); self.dataIsFrequency = 否;我已经做了这个功能,但我对 doIFFT 的结果有一些疑问(我不知道如何将其转换为 Wav 文件)再次感谢您的帮助。抱歉我的英语太糟糕了。

以上是关于如何将字节数组转换为 wav 文件 <OOURAFFT>的主要内容,如果未能解决你的问题,请参考以下文章

将字节数组转换为 Wav 文件 [重复]

Python 3:将波形数据(字节数组)转换为浮点值的 numpy 数组

如何将声音字节转换为可以在变量中访问的 .wav 文件?

如何将 8 位无符号 wav 文件转换为 8 位有符号 wav 文件?

如何转换 wav 文件-> 类似字节的对象?

如何将音频数据数组转换为 wav 文件?