2017-10-05 119 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

然後你可以在字符串上實現乘法,這樣你就可以避免上溢或下溢,所以你不會修改你的數據。您可以將所有數字視爲字符串並覆蓋「*」運算符字符串*(字符串,字符串),因此您不會遇到數據表示方面的問題。 –