主要内容

谐波-冲击源分离的时频掩蔽

时频掩蔽是对时频表示的容器施加权重,以增强、减少或隔离部分音频的过程。

谐波-冲击源分离(HPSS)的目标是将音频信号分解为谐波和冲击分量。HPSS的应用包括音频混音、改善色度特征的质量、速度估计和时间尺度修正[1].HPSS的另一个用途是在创建后期融合深度学习系统时作为并行表示。因此,2017年和2018年的许多声学场景和事件检测和分类系统(DCASE)挑战都使用了HPSS。

这个示例将遍历[1将时频掩蔽应用于谐波-冲击源分离。

有关使用深度学习获得时频掩码的示例,请参见使用深度学习网络的鸡尾酒会源分离

创建Harmonic-Percussive混合物

读在和声和打击音频文件。两者的采样率都是16khz。

[harmonicAudio, fs] = audioread (“violin.wav”);percussiveAudio = audioread (“drums.wav”);

听谐波信号并绘制声谱图。注意,沿着水平(时间)轴有连续性。

声音(harmonicAudio fs)谱图(fs harmonicAudio, 1024、512、1024年,“桠溪”)标题(“谐波音频”

图中包含一个坐标轴。标题为“谐波音频”的轴包含一个类型为图像的对象。

听敲击信号并绘制声谱图。注意,沿垂直(频率)轴有连续性。

声音(percussiveAudio fs)谱图(fs percussiveAudio, 1024、512、1024年,“桠溪”)标题(“敲击的声音”

图中包含一个坐标轴。标题为敲击音频的轴包含一个类型为图像的对象。

混合和声和打击乐器的信号。听和声敲击音频并绘制声谱图。

mix = harmonicAudio + percussiveAudio;声音(混合,fs)谱图(fs混合,1024、512、1024年,“桠溪”)标题(“Harmonic-Percussive音频”

图中包含一个坐标轴。标题为“谐波敲击音频”的轴包含一个类型为图像的对象。

由[1]创建两个增强谱图:和声增强谱图和打击增强谱图。通过在时间轴上进行中值滤波,得到谐波增强谱图。沿着频率轴应用中值滤波生成冲击增强谱图。然后比较增强的谱图,以创建谐波和冲击时频掩模。在最简单的形式中,掩码是二进制的。

使用二进制掩码的HPSS

将混合信号转换为半边幅度短时傅里叶变换(STFT)。

赢得=√损害(1024“周期”));overlapLength =地板(元素个数(赢得)/ 2);fftLength = 2^nextpow2(numel(win) + 1); / /输出y = stft(混合,...“窗口”,赢了,...“OverlapLength”overlapLength,...“FFTLength”fftLength,...“中心”,真正的);halfIdx = 1:装天花板(大小(y, 1) / 2);yhalf = y (halfIdx:);ymag = abs (yhalf);

应用中值平滑沿时间轴增强谐波音频和减少冲击音频。按照[1].绘制谐波增强音频的功率谱。

timeFilterLength = 0.2;timeFilterLengthInSamples = timeFilterLength/((numel(win) - overlapLength)/fs);ymagharm = movmedian (ymag timeFilterLengthInSamples 2);冲浪(flipud (log10 (ymagharm ^ 2)),“EdgeColor”“没有”)标题(“谐波增强音频”, 90年)视图([0])轴

图中包含一个坐标轴。标题为“谐波增强音频”的轴包含一个类型为surface的对象。

应用中值平滑沿频率轴增强冲击音频和减少谐波音频。按[1].画出敲击增强音频的功率谱。

frequencyFilterLength = 500;frequencyFilterLengthInSamples = frequencyFilterLength / (fs / fftLength);ymagperc = movmedian (ymag frequencyFilterLengthInSamples 1);冲浪(flipud (log10 (ymagperc ^ 2)),“EdgeColor”“没有”)标题(“冲击增强音频”, 90年)视图([0])轴

图中包含一个坐标轴。标题为“撞击增强音频”的轴包含一个类型为surface的对象。

要创建一个二元掩模,首先求和冲击和谐波增强的频谱,以确定每箱的总幅度。

totalmagnitperbin = ymagharm + ymagperc;

如果在一个给定的谐波增强或撞击增强的料仓中,其幅度超过该料仓总幅度的一半,则将该料仓分配给相应的掩模。

harmonicMask = ymagharm > (totalmagnitperbin *0.5);percussiveMask = ymagperc > (totalmagnitperbin *0.5);

应用谐波和冲击掩码,然后将掩码音频返回到时域。

yharm = harmonicMask。* yhalf;yperc = percussiveMask。* yhalf;

镜像半边谱,得到双边共轭对称谱。

yharm =猫(1 yharm flipud(连词(yharm)));yperc =猫(1 yperc flipud(连词(yperc)));

执行短时傅里叶反变换将信号返回到时域。

h = istft (yharm,...“窗口”,赢了,...“OverlapLength”overlapLength,...“FFTLength”fftLength,...“ConjugateSymmetric”,真正的);p = istft (yperc...“窗口”,赢了,...“OverlapLength”overlapLength,...“FFTLength”fftLength,...“ConjugateSymmetric”,真正的);

听恢复的谐波音频并绘制声谱图。

声音(h, fs)谱图(fs, h, 1024、512、1024年,“桠溪”)标题(“恢复谐波音频”

图中包含一个坐标轴。标题为“恢复谐波音频”的轴包含一个类型为图像的对象。

听恢复的敲击音频并绘制声谱图。

声音(p, fs)谱图(fs, p, 1024、512、1024年,“桠溪”)标题(“恢复敲击的声音”

图中包含一个坐标轴。标题为“恢复敲击音频”的轴包含一个类型为图像的对象。

图的组合恢复的和声和打击谱图。

声音(h + p,fs)谱图(h + p,1024,512,1024,fs,“桠溪”)标题(“恢复和声+敲击乐”

图中包含一个坐标轴。标题为“恢复谐波+敲击音频”的轴包含一个类型为图像的对象。

HPSS使用二进制掩码和残留

如[1把一个信号分解成和声和打击乐器的声音通常是不可能的。他们建议增加一个阈值参数:如果谱图的bin不是明显的和声或敲击,将其归类为剩余

执行中描述的相同步骤使用二进制掩码的HPSS创建和声增强和敲击增强谱图。

赢得=√损害(1024“周期”));overlapLength =地板(元素个数(赢得)/ 2);fftLength = 2^nextpow2(numel(win) + 1); / /输出y = stft(混合,...“窗口”,赢了,...“OverlapLength”overlapLength,...“FFTLength”fftLength,...“中心”,真正的);halfIdx = 1:装天花板(大小(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%,你就把那个箱子分配到撞击部分。否则,bin将被分配给剩余部分。最佳阈值参数取决于谐波-敲击混合和您的应用程序。

阈值=0.65;harmonicMask = ymagharm > (totalmagnitperbin *threshold);percussiveMask = ymagperc > (totalmagnitperbin *threshold);residualMask = ~ (harmonicMask + percussiveMask);

执行中描述的相同步骤使用二进制掩码的HPSS将屏蔽信号返回到时域。

yharm = harmonicMask。* yhalf;yperc = percussiveMask。* yhalf;yresi = residualMask。* yhalf;yharm =猫(1 yharm flipud(连词(yharm)));yperc =猫(1 yperc flipud(连词(yperc)));yresi =猫(1 yresi flipud(连词(yresi)));h = istft (yharm,...“窗口”,赢了,...“OverlapLength”overlapLength,...“FFTLength”fftLength,...“ConjugateSymmetric”,真正的);p = istft (yperc...“窗口”,赢了,...“OverlapLength”overlapLength,...“FFTLength”fftLength,...“ConjugateSymmetric”,真正的);r = istft (yresi...“窗口”,赢了,...“OverlapLength”overlapLength,...“FFTLength”fftLength,...“ConjugateSymmetric”,真正的);

听恢复的谐波音频并绘制声谱图。

声音(h, fs)谱图(fs, h, 1024、512、1024年,“桠溪”)标题(“恢复谐波音频”

图中包含一个坐标轴。标题为“恢复谐波音频”的轴包含一个类型为图像的对象。

听恢复的敲击音频并绘制声谱图。

声音(p, fs)谱图(fs, p, 1024、512、1024年,“桠溪”)标题(“恢复敲击的声音”

图中包含一个坐标轴。标题为“恢复敲击音频”的轴包含一个类型为图像的对象。

听回收的残余音频并绘制声谱图。

声音(r, fs)谱图(r, 1024、512、1024、fs、“桠溪”)标题(“恢复残留音频”

图中包含一个坐标轴。标题为“恢复剩余音频”的轴包含一个类型为图像的对象。

听和声、打击乐和残余信号的组合,并绘制谱图。

声音(h + p + r,fs)谱图(h + p + r,1024,512,1024,fs,)“桠溪”)标题(“恢复和声+敲击+剩余声音”

图中包含一个坐标轴。标题为“恢复谐波+敲击+剩余音频”的轴包含一个类型为图像的对象。

HPSS使用软遮罩

对于时频掩蔽,掩模通常是二进制的或软的。软掩蔽将混合箱的能量分离为谐波和撞击部分,这取决于它们增强谱图的相对权重。

执行中描述的相同步骤使用二进制掩码的HPSS创建和声增强和敲击增强谱图。

赢得=√损害(1024“周期”));overlapLength =地板(元素个数(赢得)/ 2);fftLength = 2^nextpow2(numel(win) + 1); / /输出y = stft(混合,...“窗口”,赢了,...“OverlapLength”overlapLength,...“FFTLength”fftLength,...“中心”,真正的);halfIdx = 1:装天花板(大小(y, 1) / 2);yhalf = y (halfIdx:);ymag = abs (yhalf);timeFilterLength = 0.2;timeFilterLengthInSamples = timeFilterLength /((元素个数(赢得)-overlapLength) / fs);ymagharm = movmedian (ymag timeFilterLengthInSamples 2);frequencyFilterLength = 500;frequencyFilterLengthInSamples = frequencyFilterLength / (fs / fftLength);ymagperc = movmedian (ymag frequencyFilterLengthInSamples 1); totalMagnitudePerBin = ymagharm + ymagperc;

创建软掩模,将bin能量分离到谐波和撞击部分,相对于其增强谱图的权重。

harmonicMask = ymagharm ./ totalmagnitperbin;percussiveMask = ymagperc ./ totalmagnitperbin;

执行中描述的相同步骤使用二进制掩码的HPSS将屏蔽信号返回到时域。

yharm = harmonicMask。* yhalf;yperc = percussiveMask。* yhalf;yharm =猫(1 yharm flipud(连词(yharm)));yperc =猫(1 yperc flipud(连词(yperc)));h = istft (yharm,...“窗口”,赢了,...“OverlapLength”overlapLength,...“FFTLength”fftLength,...“ConjugateSymmetric”,真正的);p = istft (yperc...“窗口”,赢了,...“OverlapLength”overlapLength,...“FFTLength”fftLength,...“ConjugateSymmetric”,真正的);

听恢复的谐波音频并绘制声谱图。

声音(h, fs)谱图(fs, h, 1024、512、1024年,“桠溪”)标题(“恢复谐波音频”

图中包含一个坐标轴。标题为“恢复谐波音频”的轴包含一个类型为图像的对象。

听恢复的敲击音频并绘制声谱图。

声音(p, fs)谱图(fs, p, 1024、512、1024年,“桠溪”)标题(“恢复敲击的声音”

图中包含一个坐标轴。标题为“恢复敲击音频”的轴包含一个类型为图像的对象。

例子函数

函数的例子中,HelperHPSS,提供本例中描述的谐波-冲击源分离功能。您可以使用它来快速探索参数如何影响算法性能。

帮助HelperHPSS
[h,p] = HelperHPSS(x,fs)将输入信号x分离为谐波(h)和敲击(p)部分。如果x作为多通道信号输入,则在处理前将其转换为单声道信号。[h,p] = HelperHPSS(…,'TimeFilterLength', TimeFilterLength)指定光谱图时间维度上的中值过滤器长度,以秒为单位。如果未指定,TIMEFILTERLENGTH默认为0.2秒。[h,p] = HelperHPSS(…,'FrequencyFilterLength', FrequencyFilterLength)指定沿频谱图的频率维度的中值滤波器长度,以Hz为单位。如果未指定,FREQUENCYFILTERLENGTH默认为500hz。[h,p] = HelperHPSS(…,'MaskType', MaskType)指定掩码类型为'binary'或'soft'。如果未指定,MASKTYPE默认为'binary'。[h,p] = HelperHPSS(…,'Threshold', Threshold)指定宣布一个元素为谐波,撞击,或残留的总能量的阈值。指定THRESHOLD为范围[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)

使用迭代掩蔽的HPSS

1]观察到,在短时傅里叶变换计算中,较大的帧尺寸使能量向谐波分量移动,而较小的帧尺寸则使能量向冲击分量移动。[1]提出使用迭代过程来利用这一洞察力。在迭代过程中:

  1. 执行HPSS使用一个大的框架尺寸,以隔离谐波成分。

  2. 将剩余部分和冲击部分相加。

  3. 执行HPSS使用一个小的框架大小,以隔离冲击组件。

threshold1 =0.7;N1 =4096;(h1, p1, r1) = HelperHPSS(混合、fs、“阈值”threshold1,“窗口”√损害(N1,“周期”)),“OverlapLength”轮(n));= p1 + 1;threshold2 =0.6;N2 =256;(h2, p2, r2) = HelperHPSS (mix1 fs,“阈值”threshold2,“窗口”√损害(N2,“周期”)),“OverlapLength”轮(N2/2));h = h1;p = p2;R = h2 + r2;

听恢复的敲击音频并绘制声谱图。

声音(h, fs)谱图(fs, h, 1024、512、1024年,“桠溪”)标题(“恢复谐波音频”

图中包含一个坐标轴。标题为“恢复谐波音频”的轴包含一个类型为图像的对象。

听恢复的敲击音频并绘制声谱图。

声音(p, fs)谱图(fs, p, 1024、512、1024年,“桠溪”)标题(“恢复敲击的声音”

图中包含一个坐标轴。标题为“恢复敲击音频”的轴包含一个类型为图像的对象。

听回收的残余音频并绘制声谱图。

声音(r, fs)谱图(r, 1024、512、1024、fs、“桠溪”)标题(“恢复残留音频”

图中包含一个坐标轴。标题为“恢复剩余音频”的轴包含一个类型为图像的对象。

听和声、打击乐和残余信号的组合,并绘制谱图。

声音(h+p+r, fs)谱图(h+p+r,1024,512,1024,fs,)“桠溪”)标题(“恢复和声+敲击+剩余声音”

图中包含一个坐标轴。标题为“恢复谐波+敲击+剩余音频”的轴包含一个类型为图像的对象。

增强时间尺度修改使用HPSS

2[,]提出了时间尺度修正(TSM)的改进方法,首先将信号分为谐波和冲击部分,然后应用TSM算法最优的部分。在TSM之后,通过对拉伸后的音频求和重构信号。

要听一个拉长的音频没有HPSS,使用默认的时间尺度修改stretchAudio函数。默认情况下,stretchAudio使用相位声码器算法。

α=1.5;mixStretched = stretchAudio(混合、α);声音(mixStretched fs)

将和声-敲击混合成和声和敲击部分使用HelperHPSS.根据[2,使用默认的声编码算法拉伸谐波部分,使用WSOLA算法拉伸冲击部分。把拉伸的部分加起来,然后听结果。

(h p) = HelperHPSS(混合,fs);hStretched = stretchAudio (h,α);pStretched = stretchAudio (pα“方法”“wsola”);mixstretch = hstretch + pstretch;声音(mixStretched, fs);

参考文献

Driedger, J., M. Muller和S. Disch。"扩展音频信号的谐波-冲击分离"国际音乐信息检索会议论文集.15卷,2014年。

Driedger, J., M. Muller和S. Ewert。利用和声-敲击分离改进音乐信号的时间尺度修正IEEE信号处理信.21卷。。问题1。105 - 109年,2014页。