验证渠道响应身份

信息处理 matlab fft DSP核心
2022-01-11 06:01:37

如果是输入信号,是输出信号,是通道的脉冲响应,那么下面的关系成立x[n]y[m]h[m]

|Y(ω)|=|H(ω)|2.|X(ω)|

其中的 DFT 。F(ω)f[n]

为了验证这一点,我编写了以下 MATLAB 代码

x = randn(1,1000);
h = [1 2 3 4 5];
y = conv(x,h);
plot((abs(fft(h,1024)).^2).*(abs(fft(x,1024))));
hold on
plot(abs(fft(y,1024)),'r')

结果表明,第二个地块的水平远低于第一个地块。当我将第二个图乘以即 NFFT 时,两个图重叠。1024

原方程有什么问题?我记得在课堂上是这样学的。

在此处输入图像描述

2个回答

我认为您在功率谱和傅立叶变换之间犯了一个错误。这是卷积理论的正确形式(没有什么是平方的):

|Y(ω)|=|H(ω)X(ω)|

试试这个,它会在 MATLAB 上为你工作。

MATLAB 代码

% Calculating the Magnitude of the Filtered Signal

vFilterCoeff = [1; 2; 3; 4; 5];
vInputSignal = randn(1000, 1);

vOutputSginal = conv(vInputSignal, vFilterCoeff);

fftNumPoints = 1024;

vOutputSignalDftMagnitude = abs(fft(vOutputSginal, fftNumPoints));
vFilteredSignalDftMagnitude = abs(fft(vFilterCoeff, fftNumPoints) .* fft(vInputSignal, fftNumPoints));

hFigure = figure();
hAxes   = axes();
plot([vOutputSignalDftMagnitude, vFilteredSignalDftMagnitude]);

结果是:

在此处输入图像描述

可以看出,有一个完全的相等性

只需将代码更改为以下内容:

x = randn(1,1000);
h = [1 2 3 4 5];
y = conv(x,h);
plot((abs(fft(h,1024))).*(abs(fft(x,1024)))); % It's |H(w)||X(w)|
hold on
plot(abs(fft(y,1024)),'--r')

您错误地将脉冲响应的 DFT 提高到了二次方。您可以看到幅度有点偏离,但峰值和谷值在同一点上更少。

在此处输入图像描述

此外,我在我的 MATLAB 2014a 中注意到,运行原始代码后出现错误。那是因为向量x是一个行向量,并且y是一列。


这部分是为了回答Drazick,声称这种方法会产生一些错误(已经出现在我的解决方案中)。

在@jojek 代码中没有相等性,因为他在乘法之前通过对两个信号应用 abs 运算符来忽略相位(与卷积定理相反)。

如果过滤器有更苛刻的相位,他的结果会有更大的误差。

首先请阅读我的 MATLAB 代码,也许你会注意到--r第二个绘图函数的开关。我故意使用虚线,否则我们只会有红色的情节而根本没有蓝色。

但是,让我们切入正题。代码现在稍作修改,因为随机信号被带有随机系数的长滤波器过滤。这就是我们比较时域卷积:|H(ω)X(ω)||H(ω)||X(ω)|

在此处输入图像描述

让我们放大:

在此处输入图像描述

所以三个都是平等的。脚本还提供了两种方法之间的最大差异,大约为下面的脚本重现结果:1013

clc, close all
x = randn(1,1000);
h = randn(1,200); % some crazy filter
y = conv(x,h);
N = length(y);

Y =  abs(fft(h,N)).*abs(fft(x,N)); % |H(w)||X(w)|
YY = abs(fft(h,N).*fft(x,N));      % |H(w)X(w)|

plot(YY,'go'); 
hold on
plot(Y,'b')    
plot(abs(fft(y,N)),'--r')
grid on
legend({'|H(w)X(w)|','|H(w)||X(w)|','conv'})

display(sprintf('Max error: %e', max(abs(YY-Y))))