MISC » フーリエ変換の分かりやすい説明 -2

前回の続きです。
http://bluedb.org/archives/47

前回の数列を離散フーリエ変換するプログラムを以下に示します。


#include <stdio.h>
#include <math.h>

int main(){
    float x[40] = {1, 0, −1, 0, 1, 0, −1, 0, 1, 0, −1, 0,
                   1, 0, −1, 0, 1, 0, −1, 0, 1, 0, −1, 0,
                   1, 0, −1, 0, 1, 0, −1, 0, 1, 0, −1, 0,
                   1, 0, −1, 0};
    float f[40];

    int j, k;

    for(j = 0; j < 40; j++){
        float real = 0;
        float imaginary = 0;

        for(k = 0; k < 40; k++){
            real += x[k] * cos((float)−j * k * 2.0 * M_PI / 40.0);
            imaginary += x[k] * sin((float)−j * k * 2.0 * M_PI  / 40.0);
        }

        f[j] = pow(real, 2.0) + pow(imaginary, 2.0);
    }

    for(j = 0; j < 40; j++){
        printf("%03d: %f\r\n", j, f[j]);
    }

    return 0;
}

特に難しいところはないのですが変数realが複素数の実部、imaginaryが複素数の虚部を示しています。配列fにはパワースペクトルが入っています。
これを実行すると


000: 0.0
001: 0.0
002: 0.0
003: 0.0
004: 0.0
005: 0.0
006: 0.0
007: 0.0
008: 0.0
009: 0.0
010: 400.0
011: 0.0
012: 0.0
013: 0.0
014: 0.0
015: 0.0
016: 0.0
017: 0.0
018: 0.0
019: 0.0
020: 0.0
021: 0.0
022: 0.0
023: 0.0
024: 0.0
025: 0.0
026: 0.0
027: 0.0
028: 0.0
029: 0.0
030: 400.0
031: 0.0
032: 0.0
033: 0.0
034: 0.0
035: 0.0
036: 0.0
037: 0.0
038: 0.0
039: 0.0

が出力されます。次回はこの結果の意味に関して話したいと思います。

http://bluedb.org/archives/60




関連商品