【问题标题】:Creating wave data from FFT data?从 FFT 数据创建波形数据?
【发布时间】:2019-11-17 18:52:41
【问题描述】:

您可能会注意到,我对 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 ) 你会得到你原来的时域信号
  • logfbank 是一个有损进程。没有足够的信息(相位等)来重建一个听起来像原始音频的波形文件。
  • 我现在已经在 Python 中添加了工作示例代码,请参阅更新的答案

标签: python signal-processing fft spectrogram mfcc


【解决方案1】:

可以使用Overlap Add method 将包含幅度和相位的适当构造的 STFT 频谱图转换回时域波形。重要的是频谱图构造必须具有constant-overlap-add 属性。

让您的修改正确地操纵频谱图的幅度和相位可能具有挑战性。所以有时相位会被丢弃,而幅度会被独立操纵。为了将其转换回波形,必须在重建(相位重建)期间估计相位信息。这是一个有损过程,通常计算量很大。已建立的方法使用迭代算法,通常是 Griffin-Lim 的变体。但现在也有new methods 使用卷积神经网络。

使用 librosa 的 mel-spectrogram 或 MFCC 波形

librosa version 0.7.0 包含一个快速的 Griffin-Lim 实现以及用于反转 MFCC 的梅尔谱图的辅助函数。

下面是一个代码示例。输入测试文件位于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 中的标准降噪算法可以大大减少它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-09
    • 1970-01-01
    • 1970-01-01
    • 2019-01-10
    • 2019-10-05
    相关资源
    最近更新 更多