如何平均复杂的响应(和理由)?


11

我正在开发通过比较输入和输出信号的FFT计算系统响应的软件。输入和输出信号被划分为多个窗口,并且对于每个窗口,将信号进行中值相减并乘以Hann函数。那么,该窗口的仪器响应就是已处理数据的FFT比率。

我相信以上是标准程序,尽管我可能对此描述不佳。我的问题来自如何组合来自多个窗口的响应。

据我所知,正确的方法是在所有窗口中平均复数值。振幅和相位响应就是每个频率上平均复数的振幅和相位:

av_response = sum_windows(response) / n
av_amplitude = sqrt(real(av_response)**2 + imag(av_response)**2)
av_phase = atan2(imag(av_response), real(av_response))

频点上的隐式环路。

但我一直在问这个改变计算幅度和在每个窗口期第一,然后平均在所有窗口的振幅和相位:

amplitude = sqrt(real(response)**2 + imag(response)**2)
av_amplitude = sum_windows(amplitude) / n
phase = atan2(imag(response), real(response))
av_phase = sum_windows(phase) / n

我认为这是不正确的,因为平均角度“是错误的”-例如,0度和360度的平均值为180度,但是与我合作的人回答说“好,我们只会显示振幅”。

所以我的问题是:

  • 我是否认为第二种方法对振幅也普遍不正确?
  • 如果是这样,是否有任何可能相关的例外情况?这些例外情况可以解释为什么我与之共事的人更喜欢第二种方法?例如,随着噪声变小,这两种方法看起来会一致,那么这可能是低噪声的公认近似值吗?
  • 如果第二种方法不正确,那么可以使用任何令人信服的权威参考来证明这一点吗?
  • 如果第二种方法不正确,是否有任何好的,易于理解的示例针对振幅进行显示(如相位为0和360度的平均值)?
  • 另外,如果做错了,对我来说,如何更好地自我教育的好书呢?

我试图证明-1 1 1 -1 1 -1 -1 -1的平均值应该为零而不是1,但这令人信服。尽管我认为我可以随着时间的流逝,基于给定特定的噪声模型,基于最大似然估计来构造一个论点,但这并不是我与之共事的人会听的那种推理。因此,如果我没有记错的话,我要么需要权威的有力论据,要么需要“明显”的示范。

[我尝试添加更多标签,但找不到相关标签,也无法将新标签定义为新用户-抱歉]


他们给出什么理由不赞成您的方法?
nibot 2012年

使用第二种方法绘制时,响应看起来更平滑。我认为这是因为,对于所观察的情况,没有明显的信号(在较高的f处),而第二种方法则迫使信号“从噪声中出现”。另外,您可能会猜到各种政治/沟通问题。
andrew cooke 2012年

1
您是否尝试提供一些测试用例?采集随机数据,并通过一些具有已知频率响应的滤波器对其进行滤波。验证传递函数估计是否收敛到已知传递函数。
nibot 2012年

没有。我没有 这是一个好建议。谢谢。如果介绍得好,我可以看到令人信服。
andrew cooke 2012年

Answers:


13

传递函数估计的实现通常与您描述的方法略有不同。

您的方法计算

F[y]F[x]

其中尖括号表示在数据段上获取的平均值,并且在进行傅立叶变换()之前将开窗函数应用于每个数据段。F

一个更典型的实现将计算x和y 的交叉谱密度除以x的功率谱密度

F[y]F[x]|F[x]|2=F[y]F[x]F[x]F[x]

其中代表点积,为复共轭。

我相信这是为了减少 bin 太小的数据段的影响。F[x]

不连贯的估计

您的雇主建议您使用

|F[y]||F[x]|

可以工作,但是有两个很大的缺点:

  1. 您没有任何相位信息。
  2. 如果您对输入和输出测量结果有任何其他噪声,则传递函数估计将不正确。ÿxy

您的方法和我描述的方法通过使用相干平均来避免这些问题。

参考文献

使用重叠平均段来计算功率谱密度的一般想法被称为韦尔奇(Welch)方法。我相信使用它来估计传递函数的扩展通常也被称为Welch方法,尽管我不确定Welch的论文中是否提到了它。查找Welch的论文可能是有价值的资源。Bendat和Piersol的书《随机数据:分析和测量程序》是关于该主题的有用专论。

验证方式

为了验证您的软件,我建议应用几个测试案例,在这些案例中,您会产生高斯白噪声,并将其通过具有已知传递函数的数字滤波器馈入。将输入和输出输入到传递函数估计例程中,并验证估计是否收敛到传递函数的已知值。


啊!谢谢。我将对此进行调查/尝试。
安德鲁·库克

@nibot此处使用什么确切的FFT长度?
Spacey 2012年

您可以使用任何长度。长度确定分辨率,并隐式(给定固定数量的数据要使用)确定平均值的数量。较长的fft =较好的分辨率,但由于平均值较少,因此误差也较大。
nibot 2012年

好的,另一个区别是您具有<F(y)F *(x)> / <F(x)F *(x)>,而声子具有<F(y)> <F *(x)> /(< F(x)> <F *(x)>)afaict:o(
andrew

计算<F(y)> <F *(x)> /(<F(x)> <F *(x)>)没有意义,因为<F *(x)>会立即取消。我认为这是正确的,因为我已经写了。
nibot 2012年

12

欢迎使用信号处理!

你是绝对正确的。您不能简单地分别对DFT幅度和相位进行平均,尤其是相位。这是一个简单的演示:

令。根据定义,大小和相位的是:z=a+bi|z|zz

|z|=a2+b2
z=tan1(ba)

两个复数值和平均值为zz1z2

z=z1+z22=a1+b1i+a2+b2i2=(a1+a2)+(b1+b2)i2

在这种情况下,

|z|=(a1+a2)24+(b1+b2)24=12(a1+a2)2+(b1+b2)2a12+b12+a22+b222

也,

z=tan1(b1a1)+tan1(b2a2)2tan1(2(b1+b2)2(a1+a2))

如果比较这些不等式的程度,可以说的近似值。是关闭的二次项,而近似在完全没有意义的。|z|z

现在,为了做您想做的事情,我建议以下几点。从理论上讲,您可以通过将输出的DFT除以输入的DFT来找到系统的脉冲响应。但是,在有噪音的情况下,您将得到非常奇怪的结果。更好的方法是使用双通道FFT脉冲响应估计,其估算方法如下(此处未提供推导,但您可以在线找到它)。

让,其中是的DFT -第(因此标)加窗的输入信号的块(因此下标为输入)。类似地,对于输出信号,令。您可以看到,信号仅仅是开窗DFT的平均值。然后,脉冲响应的统计双通道FFT逼近由下式给出:Gi(f)=Fi1(f)+Fi2(f)++FiN(f)NFik(f)kkiGo(f)=Fo1(f)+Fo2(f)++FoN(f)NG ħ˚Fħ˚FH^(f)H(f)

H^(f)=Go(f)Gi(f)|Gi(f)|2

其中,代表复共轭(翻转所有的虚数部分的符号)。()


2
谢谢; 我不知道是否投这一个或nibot是最佳的答案-我想他们都崇尚同样的过程,所以就用书的建议,但如果我有两票会包括这也太...
安德鲁·库克

1
@andrewcooke是的,他们俩都主张完全相同的事情。我希望这可以为您和您的同事们清除一切。
声子

这对我来说是一个巨大的帮助(再次感谢)。在星期一,我建议我(1)实施建议的方法,并且(2)与所有这三个已知(合成)数据进行比较。然后希望最好的方法会获胜:o)
安德鲁·库克

@Phonon我们在这里使用什么FFT长度来计算FFT?信号长度+通道最大长度+ 1?
Spacey

@Mohammad它必须至少是您期望发现的延迟时间的两倍。这是由于DFT的圆形对称性所致,因此您将在结果中同时获得因果和非因果延迟值。
声音

3

这是FFT频谱的相干和不相干平均之间的差异。相干平均更有可能拒绝分析中的随机噪声。不相干更有可能加剧随机噪声的幅度。以下哪一项对您的结果报告更重要?


如果他们给出不同的结果,我想我想要一个无偏的估计。是公正的吗?
andrew cooke 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.