我正在开发通过比较输入和输出信号的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,但这令人信服。虽然我认为我可以随着时间的流逝,基于给定特定的噪声模型,基于最大似然估计来构造一个论点,但这并不是与我一起工作的人会听的那种推理。因此,如果我没有记错的话,我需要权威机构有力的论据或“显而易见的”示范。将新用户定义为新用户-对不起]

评论

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

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

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

没有。我没有这是一个很好的建议。谢谢。如果介绍得当,我会发现这令人信服。

#1 楼

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

您的方法计算

$$ \ left \ langle \ frac {\ mathcal {F} [y] } {\ mathcal {F} [x]} \ right \ rangle $$

其中$ \ langle $尖括号$ \ rangle $代表对数据段的平均值,并且将开窗函数进行傅立叶变换($ \ mathcal {F} $)之前的每个数据段。 br />
$$ \ frac {\ langle \ mathcal {F} [y] \ cdot \ mathcal {F} [x] ^ * \ rangle} {\ langle | \ mathcal {F} [x] | ^ 2 \ rangle} = \ frac {\ langle \ mathcal {F} [y] \ cdot \ mathcal {F} [x] ^ * \ rangle} {\ langle \ mathcal {F} [x] \ cdot \ mathcal { F} [x] ^ * \ rangle} $$

其中$ \ cdot $表示点积,而$ * $表示复共轭。

我相信这是减少$ \ mathcal {F} [x] $的bin太小的数据段的影响。

不连贯的估计

您的雇主建议您使用

$$ \ frac {| \ langle \ mathcal {F} [y] | \ rangle} { \ langle | \ mathcal {F} [x] | \ rangle} $$

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


无法获得任何相位信息。
如果您对输入$ x $和输出$ y $的测量有任何其他噪声,则传递函数估计将不正确。

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

参考文献

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

验证

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

评论


$ \ begingroup $
啊!谢谢。我将对此进行调查/尝试。
$ \ endgroup $
– andrew cooke
2012年4月27日在19:28

$ \ begingroup $
@nibot这里使用什么FFT长度?
$ \ endgroup $
–太空
2012年4月28日在21:56

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

$ \ begingroup $
好的,另一个区别是您有 / ,而声子则有 /( ):o(
$ \ endgroup $
– andrew cooke
2012年5月4日在16:49

$ \ begingroup $
计算 /( )没有意义,因为的将立即取消。我认为这是正确的,因为我已经写了。
$ \ endgroup $
–nibot
2012年5月4日17:08

#2 楼

欢迎使用信号处理!

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

让$ z = a + bi $。根据定义,$ z $的大小$ | z | $和相位$ \角度z $为:

$$ | z | = \ sqrt {a ^ 2 + b ^ 2} $$
$$ \ angle z = \ tan ^ {-1} \ left(\ frac {b} {a} \ right)$$

两个复数值$ z_1 $和$ z_2 $的平均$ z $为

$$ z = \ frac {z_1 + z_2} {2} = \ frac {a_1 + b_1i + a_2 + b_2i} {2} = \ frac {(a_1 + a_2)+(b_1 + b_2)i} {2} $$

在这种情况下,

$$ | z | = \ sqrt {\ frac {(a_1 + a_2)^ 2} {4} + \ frac {(b_1 + b_2)^ 2} {4}} = \ frac {1} {2} \ sqrt {(a_1 + a_2 )^ 2 +(b_1 + b_2)^ 2} \ neq \ frac {\ sqrt {a_1 ^ 2 + b_1 ^ 2} + \ sqrt {a_2 ^ 2 + b_2 ^ 2}} {2} $$

此外,

$$ \ angle z = \ frac {\ tan ^ {-1} \ left(\ frac {b_1} {a_1} \ right)+ \ tan ^ {- 1} \ left(\ frac {b_2} {a_2} \ right)} {2} \ neq \ tan ^ {-1} \ left(\ frac {2(b_1 + b_2)} {2(a_1 + a_2)} \ right)$$

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

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

令$ G_i(f)= \ dfrac {F ^ 1_i(f)+ F ^ 2_i(f)+ \ cdots + F ^ N_i(f)} {N} $,其中$ F ^ k_i(f)$为第k个$ k $的DFT(因此,上标$ k $)开窗了输入信号的块(因此,下标$ i $用于输入)。类似地,对于输出信号,令$ G_o(f)= \ dfrac {F ^ 1_o(f)+ F ^ 2_o(f)+ \ cdots + F ^ N_o(f)} {N} $。您会看到$ G $信号只是窗口DFT的平均值。然后,脉冲响应$ H(f)$的统计双通道FFT近似值$ \ hat {H}(f)$由

$$ \ hat {H}(f)= \ frac {G_o(f)G_i ^ *(f)} {| G_i(f)| ^ 2} $$

其中$(\ cdot)^ * $表示复杂的共轭(翻转您所有虚构部分的符号)。

评论


$ \ begingroup $
谢谢;我不确定是要投票给这个问题还是给尼伯特最好的答案-我认为他们主张相同的程序,因此推荐书,但是如果我有两票也将包括这一点...
$ \ endgroup $
– andrew cooke
2012年4月28日在11:54

$ \ begingroup $
@andrewcooke是的,他们俩都主张完全相同的事情。我希望这可以为您和您的同事们清除一切。
$ \ endgroup $
– Phonon
2012年4月28日在16:25

$ \ begingroup $
对我来说是巨大的帮助(再次感谢)。在星期一,我建议我(1)实施建议的方法,并且(2)与所有这三个已知(合成)数据进行比较。然后希望最好的方法将获胜:o)
$ \ endgroup $
– andrew cooke
2012年4月28日在16:26



$ \ begingroup $
@Phonon我们在这里使用什么FFT长度来计算FFT?信号长度+通道最大长度+ 1?
$ \ endgroup $
–太空
2012年4月28日在21:58

$ \ begingroup $
@Mohammad它必须至少是您希望发现的延迟时间的两倍。这是由于DFT的圆形对称性所致,因此您的结果中将同时包含因果和非因果延迟值。
$ \ endgroup $
– Phonon
2012年4月30日在13:23

#3 楼

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

评论


$ \ begingroup $
如果他们给出不同的结果,我想我想要一个无偏的估计。是公正的吗?
$ \ endgroup $
– andrew cooke
2012年4月27日在20:12