関数fill_spectrum2_upper_half マニュアル

(The documentation of function fill_spectrum2_upper_half)

Last Update: 2021/12/7


◆機能・用途(Purpose)

ナイキスト周波数以下の成分のみが設定されたフーリエスペクトルに対して ナイキスト周波数から高周波側の成分の値を設定する。
Set the values of a Fourier spectrum in the frequencies above the Nyquist frequency given those below the Nyquist frequency.


◆形式(Format)

#include <sequence/fft.h>
inline void fill_spectrum2_upper_half
(struct imsequence2 spectrum,const double t0_dt_ratio)


◆引数(Arguments)

spectrum ナイキスト周波数以下の成分のみ値を設定したフーリエスペクトルを与える。 サンプル数は偶数でなければならない。 関数内でナイキスト周波数よりも高周波側の成分の値が設定される。
Give a Fourier spectrum for which the values are set at the frequencies less than or equal to the Nyquist frequency. The number of samples must be an even number. Within the function, the values in the higher frequencies are set.
t0_dt_ratio 引数spectrumで与えるフーリエスペクトルの元になっている時系列データの 先頭時刻\(t_0\)と時間刻み\(\Delta t\)の比\(t_0/\Delta t\)。
The ratio, \(t_0/\Delta t\), of the begining time \(t_0\) and the sampling interval \(\Delta t\) of the original time series data used to calculate the Fourier spectrum given by argument spectrum.


◆使用例(Example)

struct imsequence2 F;
fill_spectrum2_upper_half(F,0.0);


◆計算式(Formula)

時系列データ\(f(t)\)が時刻\(t=t_0+k\Delta t\), \(k=0,1,2,\cdots,2N-1\) で与えられているものとする(サンプル数は偶数であるものとして\(2N\)と表した)。 \(f_k\equiv f(t_0+k\Delta t)\)とおく。 その離散フーリエ変換は \[\begin{eqnarray} F_n &=& F(n\Delta f) \nonumber \\ &=& \sum_{k=0}^{2N-1}f_k e^{2\pi in\Delta f(t_0+k\Delta t)}\Delta t \nonumber \\ &=& e^{2\pi in\Delta f t_0}\Delta t \sum_{k=0}^{2N-1}f_k e^{2\pi ink\Delta f \Delta t} \nonumber \\ &=& e^{2\pi in\Delta f t_0}\Delta t \sum_{k=0}^{2N-1}f_k e^{\frac{2\pi ink}{2N}} \nonumber \\ & & \left(\Delta f=\frac{1}{2N\Delta t}; \hspace{0.5em} n=0,1,2,\cdots,2N-1\right) \label{eq.F_n} \end{eqnarray}\] と書ける。\(n=N\)がナイキスト周波数に対応し、 その高周波側と低周波側の成分間の関係は \[\begin{eqnarray} F_{2N-n} &=& e^{2\pi i(2N-n)\Delta f t_0}\Delta t \sum_{k=0}^{2N-1}f_k e^{\frac{2\pi i(2N-n)k}{2N}} \nonumber \\ &=& e^{4\pi iN\Delta f t_0}e^{-2\pi in\Delta f t_0}\Delta t \sum_{k=0}^{2N-1}f_k e^{2\pi ik}e^{-\frac{2\pi ink}{2N}} \nonumber \\ &=& e^{\frac{2\pi it_0}{\Delta t}}e^{-2\pi in\Delta f t_0}\Delta t \sum_{k=0}^{2N-1}f_k e^{-\frac{2\pi ink}{2N}} \nonumber \\ &=& e^{\frac{2\pi it_0}{\Delta t}}\left(F_n\right)^{*} \label{eq.F_n.over_Nyquist} \end{eqnarray}\] と書ける。ここで\(^{*}\)は複素共役を表す。 ナイキスト周波数よりも高周波側の成分は 低周波側の折り返しの複素共役(\(F_{2N-n}=(F_n)^{*}\))と思われがちだが、 \(t_0/\Delta t\)が非整数の場合には 係数\(e^{\frac{2\pi it_0}{\Delta t}}\)が掛かる点に留意。
Let the time series data \(f(t)\) be given at time \(t=t_0+k\Delta t\), \(k=0,1,2,\cdots,2N-1\); here, the number of samples is assumed to be an even number and denoted by \(2N\). Let us introduce a notation \(f_k\equiv f(t_0+k\Delta t)\). The discrete Fourier transformation of it is given by eq. (\ref{eq.F_n}). Here, \(n=0\) corresponds to the Nyquist frequency, and the frequency contents above and below it are related by (\ref{eq.F_n.over_Nyquist}), where \(^{*}\) denotes a complex conjugate. Although the frequency contents above the Nyquist frequency are often assumed to be the complex conjugate of the lower frequency contents with a reversed order (\(F_{2N-n}=(F_n)^{*}\)), note that the factor \(e^{\frac{2\pi it_0}{\Delta t}}\) is multiplied in case of an non-integer \(t_0/\Delta t\) ratio.


◆検証(Validation)

時系列データを作成し、フーリエ変換した後に ナイキスト周波数よりも高周波の成分を一旦すべて0.0に変更する。 その後、この関数を呼び出して高周波成分を再設定し、 フーリエ変換直後の値と一致するかをチェックした。
A time series data was created, and converted to a spectrum using the Fourier transformation. All the frequency contents higher than the Nyquist frequency were overwritten by 0.0. Then, the high frequency contents are set by this function, and the result was compared with the values immediately after the Fourier transformation.

まず乱数を用いて下記の時系列データを作成した。 \(t_0/\Delta t\)が非整数の場合を試すために あえて中途半端な時刻を用いた。
First, the time series data shown below was created by random values. Here, non-integer \(t_0/\Delta t\) was used for check.

時刻
Time

Value
0.339.952297e-01
0.43-2.679136e-01
0.537.827030e-01
0.638.360622e-01
0.731.350969e+00
0.83-8.504000e-01
0.93-4.255366e-01
1.037.330289e-01
1.13-5.894649e-01
1.231.356979e-01

次に関数fft2_sequenceを用いて上記の時系列データをフーリエ変換した。 結果は以下のようになった。
Then the time series data given above was converted to spectrum using the Fourier transformation by function fft2_sequence. The result was as follows.

周波数
Frequency
実部
Real part
虚部
Imaginary part
0.0002.700376e-010.000000e+00
0.625-1.099706e-012.423818e-01
1.250-4.996725e-02-1.791905e-01
1.8753.919520e-021.436212e-01
2.500-1.638197e-01-2.405474e-01
3.1252.396338e-011.912494e-01
3.7505.173287e-02-1.425164e-01
4.375-2.152057e-012.382852e-01
5.000-8.977978e-02-1.235713e-01
5.6252.931249e-01-1.310386e-01
6.250-1.515275e-015.160883e-03
6.8751.078380e-012.870045e-01
7.500-1.781512e-01-2.301350e-01
8.1251.244799e-018.165825e-02
8.750-1.549796e-01-1.028946e-01
9.3752.645016e-01-2.968817e-02

次にナイキスト周波数から高周波側の成分を一旦すべて0.0に置き換えることにより、 下記のスペクトルを作成した。
Then, replacing all the frequency contents above the Nyquist frequency to 0.0, the spectrum below was created.

周波数
Frequency
実部
Real part
虚部
Imaginary part
0.0002.700376e-010.000000e+00
0.625-1.099706e-012.423818e-01
1.250-4.996725e-02-1.791905e-01
1.8753.919520e-021.436212e-01
2.500-1.638197e-01-2.405474e-01
3.1252.396338e-011.912494e-01
3.7505.173287e-02-1.425164e-01
4.375-2.152057e-012.382852e-01
5.000-8.977978e-02-1.235713e-01
5.6250.000000e+000.000000e+00
6.2500.000000e+000.000000e+00
6.8750.000000e+000.000000e+00
7.5000.000000e+000.000000e+00
8.1250.000000e+000.000000e+00
8.7500.000000e+000.000000e+00
9.3750.000000e+000.000000e+00

このスペクトルに対して関数fill_spectrum2_upper_halfを適用する。 関数の第2引数としては元の時系列データの先頭時刻と時間刻みの比 \(0.33/0.10=3.3\)を与える。 その結果は以下の通りであった。
For this spectrum, function fill_spectrum2_upper_half was applied. For the 2nd argument of the function, the ratio of the beginning time and sampling interval of the original time series data \(0.33/0.10=3.3\) was used. The result was as follows.

周波数
Frequency
実部
Real part
虚部
Imaginary part
0.0002.700376e-010.000000e+00
0.625-1.099706e-012.423818e-01
1.250-4.996725e-02-1.791905e-01
1.8753.919520e-021.436212e-01
2.500-1.638197e-01-2.405474e-01
3.1252.396338e-011.912494e-01
3.7505.173287e-02-1.425164e-01
4.375-2.152057e-012.382852e-01
5.000-8.977978e-02-1.235713e-01
5.6252.931249e-01-1.310386e-01
6.250-1.515275e-015.160883e-03
6.8751.078380e-012.870045e-01
7.500-1.781512e-01-2.301350e-01
8.1251.244799e-018.165825e-02
8.750-1.549796e-01-1.028946e-01
9.3752.645016e-01-2.968817e-02

この結果は最初のスペクトルと完全に一致しており、 関数fill_spectrum2_upper_halfによって 高周波側の半分の成分を正しく設定できたことが分かる。
This result is perfectly consistent with the original spectrum, indicating that the upper half frequency contents were set correctly by function fill_spectrum2_upper_half.