【问题标题】:Fourier Transform Scaling the magnitude傅里叶变换缩放幅度
【发布时间】:2017-10-05 13:21:37
【问题描述】:

我有一组信号 S1, S2, ....,SN,我在数值上计算傅里叶变换 F1, F2, ,,,,FN。其中 Si 和 Fi 是 C++ 向量(我的计算使用 C++)。

我的计算目标如下:

  1. 计算积:F = F1*F2*...*FN

  2. 傅里叶逆变换F得到一个S。

我在数字上观察到的是,当我尝试计算产品时,我遇到了数字变得太小的情况。或者数字变得太大。

我想用 a1 来缩放 F1 以避免上溢或下溢。

随着缩放,我上面的第 1 步将变为

F' = (F1/a1)*(F2/a2)*...*(FN/aN) = F'1*F'2*...*F'N

当我进行逆变换时,我的最终 S' 将与 S 相差一个比例因子。 S的结构形式不会改变。我的意思是只有 S 的标准化是不同的。

我的问题是:

  1. 我的理由是否正确。

  2. 如果我的理由是正确的,那么给定一个 C++ 向量“Fi”,我如何选择一个好的比例“ai”来放大或缩小 Fi。

非常感谢。

【问题讨论】:

  • 您的问题可能更适合Mathematics Stack Exchange
  • 您使用什么数据类型(浮点数?双精度数?长双精度数?整数?)?你能至少给我们看一点代码吗?
  • 你在做复数乘法吗?
  • 是的,我使用的数字配方 fft 例程将数字的实部和复数部分并排放置,即 N 个复数被放入大小为 2N 的向量中。从 fft 例程获得输出后,我会执行复数乘法。

标签: image-processing signal-processing fft


【解决方案1】:

您可以在新域中更改 Fi 向量的范围,例如 [a, b]。因此,从您的向量 Fi 中,最小数字将变为 a,最大数字将变为 b。您可以使用以下等式缩放矢量:

Fnew[i] = (b-a)/(max-min) * (F[i] - min) + a,

其中:min = F 中的最小值 max= F 中的最大值

现在唯一的问题是选择 a 和 b。我会选择[1,2],因为值很小(所以你不会轻易溢出),但不小于0。

【讨论】:

  • 很可能我无法执行翻译,即在我重新缩放时无法向函数添加任何内容。如果我这样做,我会在信号中添加一个不存在的直流分量。
  • 那么你可以在一个字符串上实现乘法,这样你就可以避免上溢或下溢,所以你不会修改你的数据。您可以将所有数字视为字符串并覆盖“*”运算符字符串 * (string, string),这样您就不会遇到数据表示问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多