離散傅里葉變換,逆變換(c語言)


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

#define pi 3.1415926

complex complexadd(complex a, complex b){ //復數加
    complex rt;
    rt.re = a.re + b.re;
    rt.im = a.im + b.im;
    return rt;
}

complex complexMult(complex a, complex b){ //復數乘
    complex rt;
    rt.re = a.re*b.re-a.im*b.im;
    rt.im = a.im*b.re+a.re*b.im; 
    return rt;
}
//離散傅里葉變換
void dft(complex X[], complex x[], int N){ //X[]標識變換后頻域,x[]為時域采樣信號,下同
    complex temp;
    int k, n;
    for (int k = 0; k < N; k++)
    {
        X[k].re = 0;
        X[k].im = 0;
        for (int n = 0; n < N; n++)
        {
            temp.re = (float)cos(2*pi*k*n/N);
            temp.im = -(float)sin(2*pi*k*n/N);
            X[k] = complexadd(X[k], complexMult(x[n],temp));

        }
        
    }
}
//離散傅里葉逆變換
void idft(complex X[], complex x[], int N){
    complex temp;
    int k, n;
    for (int k = 0; k < N; k++)
    {
        x[k].re = 0;
        x[k].im = 0;
        for (int n = 0; n < N; n++)
        {
            temp.re = (float)cos(2*pi*k*n/N);
            temp.im = (float)sin(2*pi*k*n/N);
            x[k] = complexadd(x[k], complexMult(X[n],temp));

        }
        x[k].re /= N;
        x[k].im /= N;
    }
}

  主程序:

 

#include <stdio.h>
#include "src/dfc.h"
#define N 10

int main(){
    complex samples[N], X[N],x[N]; //samples[]示例
    
    for (int i = 0; i < N; i++)
    {
        samples[i].re = i;
        samples[i].im = 0;
    }
    dft(X, samples, N );
    printf("DFI:\n");
    for (int i = 0; i < N; i++)
    {
        printf("(%f,%f)\n",X[i].re, X[i].im);
    }
    //
    idft(X, x, N);
    printf("IDFI:\n");
    for (int i = 0; i < N; i++)
    {
        printf("(%f,%f)\n",x[i].re, x[i].im);
    }  
}

  參考自知乎大佬:https://zhuanlan.zhihu.com/p/77347644   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM