如何从 FFT 评估感知量

信息处理 fft 振幅 心理声学
2022-02-14 02:57:41

到目前为止,我可以使用幅度信息从 FFT 估计信号音量,然后将所有幅度相加,然后将该数字除以频率数。但我认为这种方法不适用于主观知觉量的估计。

2个回答

如果您将感知音量等同于响度,则有国际标准。

如果您查看 https://www.mathworks.com/matlabcentral/fileexchange/46819-a-weighting-filter-with-matlab-implementation

这是一个基于 A 加权 Matlab FFT 的实现。

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                  A-weighting Filter                  %
%              with MATLAB Implementation              %
%                                                      %
% Author: M.Sc. Eng. Hristo Zhivomirov        06/01/14 %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function xA = filterA(x, fs)

% function: xA = filterA(x, fs)
% x - signal in the time domain
% fs - sampling frequency, Hz
% xA - filtered signal in the time domain

% determine the signal size
sz = size(x);

% represent x as column-vector
x = x(:);

% signal length
xlen = length(x);

% number of unique points
NumUniquePts = ceil((xlen+1)/2);

% FFT
X = fft(x);

% fft is symmetric, throw away second half
X = X(1:NumUniquePts);

% frequency vector with NumUniquePts points
f = (0:NumUniquePts-1)*fs/xlen;

% A-weighting filter coefficients
c1 = 3.5041384e16;
c2 = 20.598997^2;
c3 = 107.65265^2;
c4 = 737.86223^2;
c5 = 12194.217^2;

% evaluate the A-weighting filter in the frequency domain
f = f.^2;
num = c1*f.^4;
den = ((c2+f).^2) .* (c3+f) .* (c4+f) .* ((c5+f).^2);
A = num./den;
A = A(:);

% filtering in the frequency domain
XA = X.*A;

% reconstruct the whole spectrum
if rem(xlen, 2)                     % odd xlen excludes the Nyquist point
    XA = [XA; conj(XA(end:-1:2))];
else                                % even xlen includes the Nyquist point
    XA = [XA; conj(XA(end-1:-1:2))];
end

% IFFT
xA = real(ifft(XA));

% represent the filtered signal in the form of the original one
xA = reshape(xA, sz);

end

Mathwork 还将向您出售具有多种加权类型的音频工具箱。

我发现这些标准有点令人困惑,因为您不知道它们是否对比例带宽滤波器的有效噪声带宽进行了校正,以及 FFT 实现是否应该考虑到这一点。

我不保证上面的 Matlab 代码。这似乎是合理的。

维基百科文章:

https://en.wikipedia.org/wiki/A-weighting

还给出了模拟传递函数,可以将其转换为数字滤波器,但实际的数字滤波器似乎更难找到。

如果您的最终目的是使用需要专业签名的标准,或者需要承担责任,我会倾向于使用 Mathwork 的产品。

你的方法不好,因为它确实

信号 -> FFT -> |·|² -> 和

也就是说,根据 Parseval 定理,信息 100% 相同于

信号 -> |·|² -> 总和

可以做的是将权重应用于 DFT 的不同频率仓幅度平方,以表示它们对感知的“重要性”。

如果你做了一个加权的事情,你会更接近感知体积,而不是你只是加起来没有(或恒定的)加权(你可以这样做,如上所述没有 FFT)。你仍然不是很准确。频率分量可以在不影响整体感知音量的情况下掩盖其他频率的事实是音频压缩器(例如众所周知的 MP3)运行良好的心理声学原因之一:您根本不必在某些地方获取声音内容如果有特定的其他频率,则考虑频率。

因此,心理声学响度模型相当复杂,并且具有与频率交叉相关的方面,并且可能具有很强的时间性。