Частотно-временная маскировка - это процесс применения весов к интервалам представления временной частоты для улучшения, уменьшения или изоляции фрагментов звука.
Цель гармоническо-ударного разделения источника (HPSS) состоит в том, чтобы разложить аудиосигнал на гармонические и ударные компоненты. Приложения HPSS включают звуковое ремиксирование, улучшение качества функций цветности, оценку темпа и изменение шкалы времени [1]. Другое использование HPSS является параллельным представлением при создании системы глубокого обучения позднего слияния. Многие высокоэффективные системы обнаружения и классификации акустических сцен и событий (DCASE) 2017 и 2018 годов использовали HPSS по этой причине.
Этот пример проходит через алгоритм, описанный в [1], чтобы применить частотно-временную маскировку к задаче гармоническо-ударного разделения источников.
Пример вывода масок частотной синхронизации с помощью глубокого обучения см. в разделе Разделение источников партий коктейлей с использованием Нейронных сетей для глубокого обучения.
Чтение в гармонических и ударных аудио файлов. Обе имеют частоту дискретизации 16 кГц.
[harmonicAudio,fs] = audioread("violin.wav"); percussiveAudio = audioread("drums.wav");
Прослушайте гармонический сигнал и постройте график спектрограммы. Обратите внимание, что вдоль горизонтальной (временной) оси имеется непрерывность.
sound(harmonicAudio,fs) spectrogram(harmonicAudio,1024,512,1024,fs,"yaxis") title("Harmonic Audio")
Послушайте ударный сигнал и постройте график спектрограммы. Обратите внимание, что вдоль вертикальной (частотной) оси имеется непрерывность.
sound(percussiveAudio,fs) spectrogram(percussiveAudio,1024,512,1024,fs,"yaxis") title("Percussive Audio")
Смешайте гармонические и ударные сигналы. Слушайте гармоническо-ударный аудио и стройте график спектрограммы.
mix = harmonicAudio + percussiveAudio; sound(mix,fs) spectrogram(mix,1024,512,1024,fs,"yaxis") title("Harmonic-Percussive Audio")
HPSS, предложенный [1], создает две улучшенные спектрограммы: спектрограмму с увеличенной гармоникой и спектрограмму с увеличенным ударным действием. Усиленная гармониками спектрограмма создается путем применения медианной фильтрации вдоль оси времени. Ударно-усиленную спектрограмму создают путем применения медианной фильтрации вдоль оси частоты. Затем улучшенные спектрограммы сравнивают, чтобы создать гармонические и ударные частотно-временные маски. В самой простой форме маски являются двоичными.
Преобразуйте смешанный сигнал в полуслойное кратковременное преобразование Фурье (STFT).
win = sqrt(hann(1024,"periodic")); overlapLength = floor(numel(win)/2); fftLength = 2^nextpow2(numel(win) + 1); y = stft(mix, ... "Window",win, ... "OverlapLength",overlapLength, ... "FFTLength",fftLength, ... "Centered",true); halfIdx = 1:ceil(size(y,1)/2); yhalf = y(halfIdx,:); ymag = abs(yhalf);
Примените медианное сглаживание вдоль оси времени, чтобы улучшить гармоническое аудио и уменьшить ударное аудио. Используйте длину фильтра 200 мс, как предложено в [1]. Постройте график спектра степени усиленного гармониками аудио.
timeFilterLength = 0.2; timeFilterLengthInSamples = timeFilterLength/((numel(win) - overlapLength)/fs); ymagharm = movmedian(ymag,timeFilterLengthInSamples,2); surf(flipud(log10(ymagharm.^2)),"EdgeColor","none") title("Harmonic Enhanced Audio") view([0,90]) axis tight
Примените медианное сглаживание вдоль оси частоты, чтобы улучшить ударное аудио и уменьшить гармоническое аудио. Используйте длину фильтра 500 Гц, как предложено в [1]. Постройте график степени спектра усиленного ударом аудио.
frequencyFilterLength = 500; frequencyFilterLengthInSamples = frequencyFilterLength/(fs/fftLength); ymagperc = movmedian(ymag,frequencyFilterLengthInSamples,1); surf(flipud(log10(ymagperc.^2)),"EdgeColor","none") title("Percussive Enhanced Audio") view([0,90]) axis tight
Чтобы создать бинарную маску, сначала суммируйте ударно-гармонические спектры, чтобы определить общую величину на интервал.
totalMagnitudePerBin = ymagharm + ymagperc;
Если на величину в данной усиленной гармоникой или усиленной ударными интервалами приходится более половины от общей величины этого интервала, присвойте этот интервал соответствующей маске.
harmonicMask = ymagharm > (totalMagnitudePerBin*0.5); percussiveMask = ymagperc > (totalMagnitudePerBin*0.5);
Примените гармонические и ударные маски, а затем верните маскированный звук во временном интервале.
yharm = harmonicMask.*yhalf; yperc = percussiveMask.*yhalf;
Зеркальное отражение полуфазного спектра для создания двустороннего сопряженного симметричного спектра.
yharm = cat(1,yharm,flipud(conj(yharm))); yperc = cat(1,yperc,flipud(conj(yperc)));
Выполните обратное короткое преобразование Фурье, чтобы вернуть сигналы во временной интервал.
h = istft(yharm, ... "Window",win, ... "OverlapLength",overlapLength, ... "FFTLength",fftLength, ... "ConjugateSymmetric",true); p = istft(yperc, ... "Window",win, ... "OverlapLength",overlapLength, ... "FFTLength",fftLength, ... "ConjugateSymmetric",true);
Прослушайте восстановленный гармонический аудио и постройте график спектрограммы.
sound(h,fs) spectrogram(h,1024,512,1024,fs,"yaxis") title("Recovered Harmonic Audio")
Прослушайте восстановленный ударный аудио и постройте график спектрограммы.
sound(p,fs) spectrogram(p,1024,512,1024,fs,"yaxis") title("Recovered Percussive Audio")
Постройте график комбинации восстановленной гармоники и ударной спектрограммы.
sound(h + p,fs) spectrogram(h + p,1024,512,1024,fs,"yaxis") title("Recovered Harmonic + Percussive Audio")
Как предлагается в [1], разложение сигнала на гармонические и ударные звуки часто невозможно. Они предлагают добавить параметр порога: если интервал спектрограммы не является явно гармоническим или ударным, классифицируйте его как остаточный.
Выполните те же шаги, которые описаны в HPSS с использованием бинарной маски, чтобы создать спектрограммы с улучшенной гармоникой и с улучшенным ударным действием.
win = sqrt(hann(1024,"periodic")); overlapLength = floor(numel(win)/2); fftLength = 2^nextpow2(numel(win) + 1); y = stft(mix, ... "Window",win, ... "OverlapLength",overlapLength, ... "FFTLength",fftLength, ... "Centered",true); halfIdx = 1:ceil(size(y,1)/2); yhalf = y(halfIdx,:); ymag = abs(yhalf); timeFilterLength = 0.2; timeFilterLengthInSamples = timeFilterLength/((numel(win) - overlapLength)/fs); ymagharm = movmedian(ymag,timeFilterLengthInSamples,2); frequencyFilterLength = 500; frequencyFilterLengthInSamples = frequencyFilterLength/(fs/fftLength); ymagperc = movmedian(ymag,frequencyFilterLengthInSamples,1); totalMagnitudePerBin = ymagharm + ymagperc;
Используя порог, создайте три бинарные маски: гармоническую, ударную и остаточную. Установите порог равным 0.65
. Это означает, что если величина интервала спектрограммы с увеличенной гармоникой составляет 65% от общей величины для этого интервала, вы присваиваете это интервал гармонического фрагмента. Если величина интервала ударно-усиленной спектрограммы составляет 65% от общей величины для этого интервала, вы присваиваете этот интервал ударного фрагмента. В противном случае интервал присваивается остаточному фрагменту. Оптимальный параметр порога зависит от гармоническо-ударной смеси и вашего применения.
threshold = 0.65;
harmonicMask = ymagharm > (порог totalMagnitudePerBin *);
ударныйMask = ymagperc > (порог totalMagnitudePerBin *);
остаточная Маска = ~ (harmonicMask + ударная Маска);
Выполните те же шаги, которые описаны в HPSS Использование двоичной маски, чтобы вернуть маскированные сигналы в временной интервал.
yharm = harmonicMask.*yhalf; yperc = percussiveMask.*yhalf; yresi = residualMask.*yhalf; yharm = cat(1,yharm,flipud(conj(yharm))); yperc = cat(1,yperc,flipud(conj(yperc))); yresi = cat(1,yresi,flipud(conj(yresi))); h = istft(yharm, ... "Window",win, ... "OverlapLength",overlapLength, ... "FFTLength",fftLength, ... "ConjugateSymmetric",true); p = istft(yperc, ... "Window",win, ... "OverlapLength",overlapLength, ... "FFTLength",fftLength, ... "ConjugateSymmetric",true); r = istft(yresi, ... "Window",win, ... "OverlapLength",overlapLength, ... "FFTLength",fftLength, ... "ConjugateSymmetric",true);
Прослушайте восстановленный гармонический аудио и постройте график спектрограммы.
sound(h,fs) spectrogram(h,1024,512,1024,fs,"yaxis") title("Recovered Harmonic Audio")
Прослушайте восстановленный ударный аудио и постройте график спектрограммы.
sound(p,fs) spectrogram(p,1024,512,1024,fs,"yaxis") title("Recovered Percussive Audio")
Прослушайте восстановленный остаточный аудио и постройте график спектрограммы.
sound(r,fs) spectrogram(r,1024,512,1024,fs,"yaxis") title("Recovered Residual Audio")
Слушайте комбинацию гармонических, ударных и остаточных сигналов и стройте график спектрограммы.
sound(h + p + r,fs) spectrogram(h + p + r,1024,512,1024,fs,"yaxis") title("Recovered Harmonic + Percussive + Residual Audio")
Для частотно-временной маскировки маски обычно являются либо двоичными, либо мягкими. Мягкая маскировка разделяет энергию смешанных интервалов на гармонические и ударные фрагменты в зависимости от относительных весов их усиленных спектрограмм.
Выполните те же шаги, которые описаны в HPSS с использованием бинарной маски, чтобы создать спектрограммы с улучшенной гармоникой и с улучшенным ударным действием.
win = sqrt(hann(1024,"periodic")); overlapLength = floor(numel(win)/2); fftLength = 2^nextpow2(numel(win) + 1); y = stft(mix, ... "Window",win, ... "OverlapLength",overlapLength, ... "FFTLength",fftLength, ... "Centered",true); halfIdx = 1:ceil(size(y,1)/2); yhalf = y(halfIdx,:); ymag = abs(yhalf); timeFilterLength = 0.2; timeFilterLengthInSamples = timeFilterLength/((numel(win)-overlapLength)/fs); ymagharm = movmedian(ymag,timeFilterLengthInSamples,2); frequencyFilterLength = 500; frequencyFilterLengthInSamples = frequencyFilterLength/(fs/fftLength); ymagperc = movmedian(ymag,frequencyFilterLengthInSamples,1); totalMagnitudePerBin = ymagharm + ymagperc;
Создайте мягкие маски, которые разделяют энергию интервала на гармонические и ударные фрагменты относительно весов их усиленных спектрограмм.
harmonicMask = ymagharm ./ totalMagnitudePerBin; percussiveMask = ymagperc ./ totalMagnitudePerBin;
Выполните те же шаги, которые описаны в HPSS Использование двоичной маски, чтобы вернуть маскированные сигналы в временной интервал.
yharm = harmonicMask.*yhalf; yperc = percussiveMask.*yhalf; yharm = cat(1,yharm,flipud(conj(yharm))); yperc = cat(1,yperc,flipud(conj(yperc))); h = istft(yharm, ... "Window",win, ... "OverlapLength",overlapLength, ... "FFTLength",fftLength, ... "ConjugateSymmetric",true); p = istft(yperc, ... "Window",win, ... "OverlapLength",overlapLength, ... "FFTLength",fftLength, ... "ConjugateSymmetric",true);
Прослушайте восстановленный гармонический аудио и постройте график спектрограммы.
sound(h,fs) spectrogram(h,1024,512,1024,fs,"yaxis") title("Recovered Harmonic Audio")
Прослушайте восстановленный ударный аудио и постройте график спектрограммы.
sound(p,fs) spectrogram(p,1024,512,1024,fs,"yaxis") title("Recovered Percussive Audio")
The функции , взятой в качестве примера,, HelperHPSS
, обеспечивает гармоническо-ударные возможности разделения источников, описанные в этом примере. Можно использовать его, чтобы быстро исследовать, как параметры влияют на эффективность алгоритма.
help HelperHPSS
[h,p] = HelperHPSS(x,fs) separates the input signal, x, into harmonic (h) and percussive (p) portions. If x is input as a multichannel signal, it is converted to mono before processing. [h,p] = HelperHPSS(...,'TimeFilterLength',TIMEFILTERLENGTH) specifies the median filter length along the time dimension of a spectrogram, in seconds. If unspecified, TIMEFILTERLENGTH defaults to 0.2 seconds. [h,p] = HelperHPSS(...,'FrequencyFilterLength',FREQUENCYFILTERLENGTH) specifies the median filter length along the frequency dimension of a spectrogram, in Hz. If unspecified, FREQUENCYFILTERLENGTH defaults to 500 Hz. [h,p] = HelperHPSS(...,'MaskType',MASKTYPE) specifies the mask type as 'binary' or 'soft'. If unspecified, MASKTYPE defaults to 'binary'. [h,p] = HelperHPSS(...,'Threshold',THRESHOLD) specifies the threshold of the total energy for declaring an element as harmonic, percussive, or residual. Specify THRESHOLD as a scalar in the range [0 1]. This parameter is only valid if MaskType is set to 'binary'. If unspecified, THRESHOLD defaults to 0.5. [h,p] = HelperHPSS(...,'Window',WINDOW) specifies the analysis window used in the STFT. If unspecified, WINDOW defaults to sqrt(hann(1024,'periodic')). [h,p] = HelperHPSS(...,'FFTLength',FFTLENGTH) specifies the number of points in the DFT for each analysis window. If unspecified, FFTLENGTH defaults to the number of elements in the WINDOW. [h,p] = HelperHPSS(...,'OverlapLength',OVERLAPLENGTH) specifies the overlap length of the analysis windows. If unspecified, OVERLAPLENGTH defaults to 512. [h,p,r] = HelperHPSS(...) returns the residual signal not classified as harmonic or percussive. Example: % Load a sound file and listen to it. [audio,fs] = audioread('Laughter-16-8-mono-4secs.wav'); sound(audio,fs) % Call HelperHPSS to separate the audio into harmonic and percussive % portions. Listen to the portions separately. [h,p] = HelperHPSS(audio,fs); sound(h,fs) sound(p,fs)
[1] заметил, что большой формат кадра в вычислении STFT смещает энергию к гармоническому компоненту, в то время как небольшой формат кадра смещает энергию к ударному компоненту. [1] предложил использовать итеративную процедуру, чтобы использовать это понимание. В итерационной процедуре:
Выполните HPSS, используя большой формат кадра, чтобы изолировать гармонический компонент.
Суммируйте остаточные и ударные фрагменты.
Выполните HPSS с использованием небольшого формата кадра, чтобы изолировать ударный компонент.
threshold1 = 0.7; N1 = 4096; [h1, p1, r1] = HelperHPSS (микс, fs,"Threshold", threshold1,"Window", sqrt (hann (N1,"periodic")),"OverlapLength", круглый (N1/2)); mix1 = p1 + r1; threshold2 = 0.6; N2 = 256; [h2, p2, r2] = HelperHPSS (mix1, fs,"Threshold", threshold2,"Window", sqrt (hann (N2,"periodic")),"OverlapLength", раунд (N2/2)); h = h1; p = p2; r = h2 + r2;
Прослушайте восстановленный ударный аудио и постройте график спектрограммы.
sound(h,fs) spectrogram(h,1024,512,1024,fs,"yaxis") title("Recovered Harmonic Audio")
Прослушайте восстановленный ударный аудио и постройте график спектрограммы.
sound(p,fs) spectrogram(p,1024,512,1024,fs,"yaxis") title("Recovered Percussive Audio")
Прослушайте восстановленный остаточный аудио и постройте график спектрограммы.
sound(r,fs) spectrogram(r,1024,512,1024,fs,"yaxis") title("Recovered Residual Audio")
Слушайте комбинацию гармонических, ударных и остаточных сигналов и стройте график спектрограммы.
sound(h + p + r,fs) spectrogram(h+p+r,1024,512,1024,fs,"yaxis") title("Recovered Harmonic + Percussive + Residual Audio")
[2] предлагает, что изменение шкалы времени (TSM) может быть улучшено путем сначала разделения сигнала на гармонические и ударные фрагменты, а затем применения оптимального для фрагмента алгоритма TSM. После TSM сигнал восстанавливается путем суммирования растянутого аудио.
Чтобы прослушать растянутый звук без HPSS, примените изменение шкалы времени с помощью stretchAudio
по умолчанию функция. По умолчанию
stretchAudio
использует фазу алгоритм вокодера.
alpha = 1.5;
mixStretched = stretchAudio (mix, альфа);
звук (mixРастянутый, fs)
Разделите гармоническо-ударную смесь на гармонические и ударные фрагменты с помощью HelperHPSS
. Как предложено в [2], используйте алгоритм вокодера по умолчанию, чтобы растянуть гармонический фрагмент и алгоритм WSOLA, чтобы растянуть ударный фрагмент. Суммируйте растянутые фрагменты и прослушайте результаты.
[h,p] = HelperHPSS(mix,fs); hStretched = stretchAudio(h,alpha); pStretched = stretchAudio(p,alpha,"Method","wsola"); mixStretched = hStretched + pStretched; sound(mixStretched,fs);
[1] Driedger, J., M. Muller, and S. Disch. «Расширение гармоническо-ударного разделения аудиосигналов». Материалы Международной конференции по поиску информации о музыке. Том 15, 2014.
[2] Driedger, J., M. Muller, and S. Ewert. «Улучшение масштабной модификации музыкальных сигналов с использованием гармоническо-перкуссивного разделения». Буквы обработки сигналов IEEE. Том 21. Выпуск 1. с. 105-109, 2014.