Создание волновых данных из данных БПФ?

Как вы могли заметить, я действительно новичок в python и обработке звука. Я (надеюсь) извлек данные БПФ из волнового файла, используя python и функции logfbank и mfcc. (Кажется, logfbank дает наиболее многообещающие данные, вывод mfcc выглядел для меня немного странно).

В моей программе я хочу изменить данные logfbank/mfcc, а затем создать из них волновые данные (и записать их в файл). Я действительно не нашел никакой информации о процессе создания волновых данных из данных БПФ. Кто-нибудь из вас знает, как это решить? Я был бы очень признателен :)

Это мой код до сих пор:

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

person hndr    schedule 08.07.2019    source источник
comment
когда вы начинаете с сигнала во временной области, такого как синусоидальная волна, затем предоставляете его массив для вызова fft, у вас затем есть его представление в частотной области ... если вы затем отправите этот массив частотной области в обратный fft (ifft), вы вернете свой исходный сигнал во временной области   -  person Scott Stensland    schedule 08.07.2019
comment
logfbank — это процесс с потерями. Недостаточно информации (фаза и т. д.) для восстановления волнового файла, звучащего как исходный звук.   -  person hotpaw2    schedule 08.07.2019
comment
Теперь я добавил рабочий пример кода на Python, см. обновленный ответ.   -  person Jon Nordby    schedule 08.09.2019


Ответы (1)


Подходящим образом построенную спектрограмму STFT, содержащую как амплитуду, так и фазу, можно преобразовать обратно в форму волны во временной области с помощью метод Overlap Add. Важно то, что построение спектрограммы должно иметь constant-overlap-add собственность.

Может быть сложно заставить ваши модификации правильно манипулировать как величиной, так и фазой спектрограммы. Поэтому иногда фаза отбрасывается, а величина изменяется независимо. Чтобы преобразовать это обратно в сигнал, необходимо затем оценить информацию о фазе во время реконструкции (восстановления фазы). Это процесс с потерями и, как правило, довольно ресурсоемкий. В общепринятых подходах используется итеративный алгоритм, обычно являющийся разновидностью алгоритма Гриффина-Лима. Но теперь есть и новые методы с использованием сверточных нейронных сетей.

Форма волны из мел-спектрограммы или MFCC с использованием librosa

librosa версии 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)

Полученные результаты

Восстановленная форма волны будет иметь некоторые артефакты.

В приведенном выше примере много повторяющегося шума, больше, чем я ожидал. Его удалось довольно сильно уменьшить с помощью стандартного алгоритма Noise Reduction в Audacity.

Спектрограммы исходного звука, восстановленного звука и восстановленного звука с удаленным шумом

person Jon Nordby    schedule 02.08.2019