Как восстановить звук инструмента из файла .WAV с помощью FFT и findpeaks () в MATLAB? - PullRequest
0 голосов
/ 03 мая 2019

Я хочу сгенерировать свои собственные сэмплы звуков Kick, Clap, Snare и Hi-Hat в MATLAB на основе сэмпла, который у меня есть в формате .WAV.

Сейчас это звучит не совсем правильно, и мне было интересно, если мой код не имеет смысла? Или, если это так, что мне не хватает какой-то теории звука.

Вот мой код прямо сейчас.

 [y,fs]=audioread('cp01.wav');
 Length_audio=length(y);
 df=fs/Length_audio;
 frequency_audio=-fs/2:df:fs/2-df;
 frequency_audio = frequency_audio/(fs/2); //Normalize the frequency
 figure
 FFT_audio_in=fftshift(fft(y))/length(fft(y));
 plot(frequency_audio,abs(FFT_audio_in));

Оригинальный сюжет г.

The sound

Мой БПФ от y

enter image description here

Я использую функцию findpeaks (), чтобы найти пики БПФ с амплитудой, превышающей 0,001.

[pk, loc] = findpeaks(abs(FFT_audio_in), 'MinPeakHeight', 0.001);

Затем я нахожу соответствующие нормализованные частоты по частоте аудио (положительные) и соответствующий пик.

 loc = frequency_audio(loc);
 loc = loc(length(loc)/2+1:length(loc))
 pk = pk(length(pk)/2+1:length(pk))

Итак, односторонний нормализованный БПФ выглядит следующим образом.

enter image description here

Поскольку это выглядит как БПФ, я думаю, что смогу воссоздать звук, суммируя синусоиды с правильной амплитудой и частотой. Так как звук хлопка имел 21166 точек данных, я использую это для цикла for.

for i=1:21116

    clap(i) = 0;
for j = 1:length(loc);
    clap(i) = bass(i) + pk(j)*sin(loc(j)*i);

end

end

Но это приводит к следующему звуку, который далеко не похож на оригинальный звук. enter image description here

Что мне делать по-другому?

1 Ответ

1 голос
/ 05 мая 2019

Вы берете БПФ всего периода времени выборки, а затем генерируете стационарные синусоиды на протяжении всей продолжительности.Это означает, что временная подпись барабана исчезла.А временная сигнатура является наиболее характерной чертой ударных невокализованных инструментов.

Поскольку это очень важно, я предлагаю вам начать сначала с частотного контента.Временная сигнатура может быть аппроксимирована огибающей сигнала.Для этого в MATLAB есть удобная функция envelope .Используйте это, чтобы извлечь конверт вашего образца.

Затем сгенерируйте немного белого шума и умножьте шум на конверт, чтобы воссоздать очень простую версию вашего ударного инструмента.Вы должны услышать четкую разницу между Kick, Clap, Snare и Hi-Hat, хотя они не будут звучать так же, как оригинал.

Как только это сработает, вы можете попытаться включить информацию о частоте.Я рекомендую взять STFT, чтобы получить спектрограмму звука, чтобы вы могли видеть, как частотный спектр изменяется с течением времени.

...