从FFT数据创建波形数据?

3
作为你们可能已经注意到的,我对Python和声音处理非常陌生。我用Python和logfbank和mfcc函数从波形文件中提取了FFT数据(希望如此)。 (logfbank似乎给出了最有前途的数据,但是mfcc输出对我来说看起来有点奇怪)。
在我的程序中,我想改变logfbank / mfcc数据,然后从中创建波形数据(并将它们写入文件)。 我没有真正找到有关从FFT数据创建波形数据的过程的任何信息。 你们中有没有人有解决方法? 我会非常感激 :)
这是我迄今为止的代码:
from scipy.io import wavfile 
import numpy as np
from python_speech_features import mfcc, logfbank

rate, signal = wavfile.read('orig.wav')
fbank = logfbank(signal, rate, nfilt=100, nfft=1400).T
mfcc = mfcc(signal, rate, numcep=13, nfilt=26, nfft=1103).T 

#magic data processing of fbank or mfcc here

#creating wave data and writing it back to a .wav file here

当你从一个时间域信号(如正弦波)开始,然后将其数组提供给FFT调用,你就可以获得它的频率域表示...如果你将该频域数组发送到逆FFT(IFFT),你将得到原始的时间域信号。 - undefined
2
logfbank是一个有损的过程。剩下的信息不足(相位等)以重建一个听起来像原始音频的波形文件。 - undefined
我现在已经添加了Python的工作示例代码,请查看更新的答案。 - undefined
1个回答

5
一个合适构造的包含幅度和相位的STFT谱图可以使用Overlap Add方法转换回时间域波形。重要的是,谱图构建必须具有constant-overlap-add特性。
正确操作谱图的幅度和相位可能会有挑战性。因此有时会舍弃相位,并独立地操作幅度。为了将其转换回波形,必须在重建过程中估计相位信息(相位重建)。这是一种有损过程,通常需要非常大的计算量。已经成熟的方法使用迭代算法,通常是Griffin-Lim的变体。但现在也有一些新的方法使用卷积神经网络。
使用librosa从mel-spectrogram或MFCC获取波形。

librosa版本0.7.0 包含快速的Griffin-Lim实现,以及帮助反转MFCC的mel-spectrogram的辅助函数。

以下是一个代码示例。输入测试文件可以在https://github.com/jonnor/machinehearing/blob/ab7fe72807e9519af0151ec4f7ebfd890f432c83/handson/spectrogram-inversion/436951__arnaud-coutancier__old-ladies-pets-and-train-02.flac中找到。

import numpy
import librosa
import soundfile

# parameters
sr = 22050
n_mels = 128
hop_length = 512
n_iter = 32
n_mfcc = None # can try n_mfcc=20

# load audio and create Mel-spectrogram
path = '436951__arnaud-coutancier__old-ladies-pets-and-train-02.flac'
y, _ = librosa.load(path, sr=sr)
S = numpy.abs(librosa.stft(y, hop_length=hop_length, n_fft=hop_length*2))
mel_spec = librosa.feature.melspectrogram(S=S, sr=sr, n_mels=n_mels, hop_length=hop_length)

# optional, compute MFCCs in addition
if n_mfcc is not None:
    mfcc = librosa.feature.mfcc(S=librosa.power_to_db(S), sr=sr, n_mfcc=n_mfcc)
    mel_spec = librosa.feature.inverse.mfcc_to_mel(mfcc, n_mels=n_mels)

# Invert mel-spectrogram
S_inv = librosa.feature.inverse.mel_to_stft(mel_spec, sr=sr, n_fft=hop_length*4)
y_inv = librosa.griffinlim(S_inv, n_iter=n_iter,
                            hop_length=hop_length)

soundfile.write('orig.wav', y, samplerate=sr)
soundfile.write('inv.wav', y_inv, samplerate=sr)

结果

重建的波形会有一些伪影。

上面的例子出现了很多重复噪声,超出我的预期。使用Audacity中的标准降噪算法可以相当程度地减少它。

Spectrograms of original audio, reconstructed audio and reconstructed audio with noise removed


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接