在音频信号中获得零本地均值的任何好方法?

时间:2017-04-15 18:00:10

标签: matlab audio convolution window-functions audio-processing

之前我曾在DSP.SE上提出这个问题,但我的问题没有得到关注。也许它与信号处理没那么相关。

我需要将一个离散的音频信号分成几段,对它们进行一些统计处理和分析。因此,具有固定本地均值的段对我的情况非常有帮助。段的长度是预定义的,例如, 512 样本。

我尝试过几件事。我使用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

从每个x(k)中减去seg(:,k)会使每个局部均值为零,但是当链接回来时,它会使音频信号失真很多。

所以,由于hanning窗口的平均值几乎 0.5 ,从每个2*x(k)*hann(L)减去seg(:,k)是我尝试的第一件事。但这次乘以 2 (使汉宁窗口的平均值几乎等于 1 扭曲了每个段本身中点的邻域

enter image description here

然后,我使用较小的hanning窗口而不是直接乘法进行卷积,并从每个seg(:,k)中减去这些(如下图所示)

enter image description here

最后一步提供了更好的结果,但在细分较小时它仍然不是很有用。我在这个网站上看到了许多令人惊讶的方法来解决不同的问题。所以我只是想知道是否有任何聪明的方法或现有方法来获得零本地方法,这会减少音频信号的失真。我读过,这个属性在某些分解中很有用,例如EMD。那么也许我需要这样的分解?

1 个答案:

答案 0 :(得分:1)

您可以尝试使用移动平均滤镜:

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);

您可以通过更改均值过滤器的间隔来调整过滤器。使用较小的间隔会导致每个间隔内的均值较低,但过滤信号的频率也会降低。

enter image description here