2017-10-05 70 views
1

我有一组信号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。

非常感谢提前。

+2

你的问题可能更适合[数学堆栈交换](https:/ /math.stackexchange.com/)。 – Ron

+0

你使用的是什么数据类型(float?double?long double?int)?你能告诉我们至少有一点代码吗? – metal

+0

你在做复数乘法吗? – Commodore63

回答

0

您可以在新域中更改Fi矢量的范围,比如说[a,b]。所以从你的矢量Fi中,最小的数字将变成a,最大的数字变成b。可以使用该方程缩放矢量:

Fnew [I] =(BA)/(最大值 - 最小值)*(F [I] - 分钟)+ A,

其中:分钟=最小值从F max =最大值从F

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

+0

很可能我无法执行翻译,即在重新缩放时不能添加任何内容。如果我这样做,我会添加一个直流分量到不存在的信号。 – user1612986

+0

然后你可以在字符串上实现乘法,这样你就可以避免上溢或下溢,所以你不会修改你的数据。您可以将所有数字视为字符串并覆盖“*”运算符字符串*(字符串,字符串),因此您不会遇到数据表示方面的问题。 –