首页 > 编程语言 >C++傅里叶变换

C++傅里叶变换

时间:2023-05-13 11:02:19浏览次数:36  
标签:temp 变换 float C++ re int complex im 傅里叶

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


#define pi 3.1415926

typedef struct 
{
    float re;// really 
    float im;// imaginary 
}complex, * pcomplex;

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 F[], complex x[], int N) //X[]标识变换后频域,x[]为时域采样信号,下同
{ 
    float data_re[10];
    float data_im[10];
    complex temp;
    complex data;
    int k, n;
    for (int k = 0; k < N; k++)
    {
        F[k].re = 0;
        F[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);
            F[k] = complexadd(F[k], complexMult(x[n], temp));
            data = complexadd(F[k], complexMult(x[n], temp));
            data_re[n] = temp.re;
            data_im[n] = temp.im;
        }
    }
}
//离散傅里叶逆变换
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;
    }
}

#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);
    }
}
一维数组的傅里叶变换

 运行结果如下

 

标签:temp,变换,float,C++,re,int,complex,im,傅里叶
From: https://www.cnblogs.com/lizhiqiang0204/p/17396929.html

相关文章

  • C++是如何工作的
     在#符号之后的都是预处理语句,编译器收到源文件,看到这条语句就先处理这条预处理语句因为在实际编译发送之前就被处理了 include含义:它需要找到这文件,将这个文件所有内容拷贝到现在的文件内,这些文件就是头文件 iostream:我们需要被调用的函数的声明std::out可以让我们在终......
  • 1011 A+B 和 C(C++)
    一、问题描述:给定区间[−231,231]内的3个整数 A、B 和 C,请判断 A+B 是否大于 C。输入格式:输入第1行给出正整数 T (≤10),是测试用例的个数。随后给出 T 组测试用例,每组占一行,顺序给出 A、B 和 C。整数间以空格分隔。输出格式:对每组测试用例,在一行中输出 C......
  • c++打卡第二十四天
    一、亲密数1、问题描述 2、设计思路①、我们可以设计函数计算一个数的因子,将这些因子相加到一起,返回和并对这个返回值重新调用求因子函数,如果这个函数返回值为A,那么这两个数为亲密数,打印出AB。②、求因子可以对A进行2~A的遍历,同时c除余d,如果余数为0,那么d就是c的因子。3、流......
  • 记一次C++后台开发面试拷打过程
    开头简单的自我介绍,面试官和我聊了聊天缓解个人紧张状况,然后就让开屏幕共享开视频做题目,做完以后,问了一些问题,就让等通知了,估计是凉了,不过这里且把当时做的笔试题目复盘一下吧!题目是ai做的题解,唉,AI都比我强,比我面试的时候解释的强多了,未来该何去何从啊...微*团队c++笔试题45......
  • C++趣味编程
    最佳存款方案1#include<iostream>2usingnamespacestd;3intmain()4{5doublex=1000;6for(inti=1;i<=5;i++)7{8x=x/(1+12*0.0063);9if(i!=5)10{11x=x+1000;12}13}14......
  • C++
    运算符重载请定义一个分数类,拥有两个整数的私有数据成员,分别表示分子和分母(分母永远为正数,符号通过分子表示)。重载运算符加号"+",实现两个分数的相加,所得结果必须是最简分数。#include<iostream>usingnamespacestd;classScore{intx=0;//分母inty=0;//分子public:......
  • 终于找到了C++成员函数做函数指针的完美解决办法
    当然,这是转自别人的:https://www.codenong.com/19808054/之前因为这个没少废精力啊,这里记一下,感谢外国友人的回答.1#include<iostream>2#include<functional>3#include<string>4#include<sstream>5#include<memory>67usingnamespacestd;89......
  • C++ 模板
     模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。模板是创建泛型类或函数的蓝图或公式。库容器,比如迭代器和算法,都是泛型编程的例子,它们都使用了模板的概念。每个容器都有一个单一的定义,比如 向量 ,我们可以定义许多不同类型的向量,比如 vector<in......
  • C++ 变量类型
    C++变量类型变量其实只不过是程序可操作的存储区的名称。C++中每个变量都有指定的类型,类型决定了变量存储的大小和布局,该范围内的值都可以存储在内存中,运算符可应用于变量上。变量的名称可以由字母、数字和下划线字符组成。它必须以字母或下划线开头。大写字母和小写字母是不......
  • C++ 模板
    模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。模板是创建泛型类或函数的蓝图或公式。库容器,比如迭代器和算法,都是泛型编程的例子,它们都使用了模板的概念。每个容器都有一个单一的定义,比如 向量 ,我们可以定义许多不同类型的向量,比如 vector<int> 或......