在音频信号中获取零局部平均值的好方法?
问题描述:
我已经问过的DSP.SE这个问题,但我的问题一直没有得到重视。也许它与信号处理没有太大的关系。在音频信号中获取零局部平均值的好方法?
我需要离散的音频信号划分成段,以对他们的一些统计处理和分析。因此,具有固定地方平均值的部分对我的情况会非常有帮助。段的长度是预定义的,例如, 样品。
我已经试过几件事情。我使用reshape()
功能的音频信号划分成段,然后计算各段的手段:
L = 512; % Length of segment
N = floor(length(audio(:,1))/L); % Number of segments
seg = reshape(audio(1:N*L,1), L, N); % Reshape into LxN sized matrix
x = mean(seg); % Calculate mean of each column
从每个seg(:,k)
减去x(k)
将使每一个局部均值为零,但它会扭曲音频信号时,很多细分被加入。
所以,既然宁窗口的平均值几乎是0.5,从其减去从每个seg(:,k)
2*x(k)*hann(L)
是我想的第一件事。但是,这一次通过 乘以(使汉宁窗的平均值几乎等于)扭曲在每个段本身中点附近。
然后,我已经通过一个较小的汉宁窗,而不是直接相乘,并且从每个seg(:,k)
减去这些(如下图所示)的用于卷积。
这最后一步给出了更好的结果,但它仍然不是非常有用,当段较小。在这个网站上,我看到了许多令人惊异的方法来解决各种问题。所以我只是想知道是否有任何聪明的方法或现有的方法来获得零局部手段,使音频信号变形较少。我看书上说,这个属性是在一些分解,如EMD有用。所以也许我需要这样的分解?
答
你可以尝试使用移动平均滤波器:
x = cumsum(rand(15*512, 1)-0.5); % generate a random input signal
mean_filter = 1/512 * ones(1, 512); % generate a mean filter
mean = filtfilt(mean_filter, 1, x); % filtfilt is used instead of filter to obtain a symmetric moving average.
% plot the result
figure
subplot(2,1,1)
plot(x);
hold on
plot(mean);
subplot(2,1,2)
plot(x - mean);
您可以通过改变均值滤波的间隔地调整滤波器。使用较小的间隔,会在每个间隔内产生较低的平均值,但也会在信号中滤除更多的低频。
也许你应该减去局部平均值,过程,然后段连接到一起之前添加本地均值再次打开。您也可以尝试重叠您的细分(例如50%),并在您重新加入时从一个细分淡入到另一个细分。 – mikado
@mikado我不会添加本地方式。我需要这个操作来进行盲目处理。我正在寻找一种好方法,它可以在使每个段的局部均值为零时,使音频文件变形更小。不过谢谢你的建议。 – kdrtkl