gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 23:06:09 26 4
gpt4 key购买 nike

我之前在 DSP.SE 上问过这个问题,但我的问题没有引起注意。也许它与信号处理无关。

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

我已经尝试了几件事。我确实使用 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)将使每个局部均值为零,但是当片段重新连接时,它会使音频信号失真很多。

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

enter image description here

然后,我通过一个较小的汉宁窗口使用卷积,而不是直接相乘,并从每个 seg(:,k) 中减去这些(如下图所示) .

enter image description here

这最后一步提供了更好的结果,但是当段较小时它仍然不是很有用。我在这个网站上看到了许多针对不同问题的惊人方法。所以我只是想知道是否有任何聪明的方法或现有的方法来获得零局部均值,从而减少音频信号的失真。我读到了,这个属性在某些分解中很有用,例如 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);

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

enter image description here

关于matlab - 在音频信号中获得零本地均值的任何好方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43429446/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com