首页 > 编程语言 >C++用代码验证“一切函数皆可傅里叶”

C++用代码验证“一切函数皆可傅里叶”

时间:2023-05-17 14:00:26浏览次数:32  
标签:验证 int C++ re complex im colums printf 傅里叶

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


#define pi 3.1415926
#define rows 3
#define colums 5

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[]为时域采样信号
{
    complex temp;
    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));
        }
        F[k].re = F[k].re / N;
        F[k].im = F[k].im / N;
    }
}

int main() {
    complex samples[colums], X[colums]; //samples[]示例
    for (int i = 0; i < colums; i++) {
        samples[i].re = i+1;
        samples[i].im = 0;
    }
    printf("原函数:\n");
    for (int i = 0; i < colums; i++) {
        printf("(%f,%f)\n", samples[i].re, samples[i].im);
    }
    printf("\n");

    dft(X, samples, colums);
    printf("原函数傅里叶变换 DFI:\n");
    for (int i = 0; i < colums; i++) {
        printf("(%f,%f)\n", X[i].re, X[i].im);
    }
    printf("\n");

    complex verify[colums];
    for (int i = 0; i < colums; i++) {
        verify[i].re = 0;
        verify[i].im = 0;
    }
    float Amplitude = 0;//幅度
    float Phase = 0;//相位
    float Frequency = 0;//频率
    float t = 0;//自变量
    float Re = 0;
    float Im = 0;
    printf("幅度      频率     采样弧度    相位    实部      虚部 \n");
    for (int j = 0; j < colums; j++){
        Frequency = j;//计算每个三角函数的频率
        for (int i = 0; i < colums; i++) {
            Amplitude = sqrt(pow(X[i].re, 2) + pow(X[i].im, 2));//计算每个三角函数的幅度
            Phase = atan2(X[i].im, X[i].re);//计算每个三角函数的相位
            t = 2 * pi * i / colums;//计算采样弧度
            Re = Amplitude * cos(Frequency * t + Phase);//计算函数的实部
            Im = Amplitude * sin(Frequency * t + Phase);//计算函数的虚部
            verify[j].re += Re;
            verify[j].im += Im;

            //verify[j].re += Amplitude * cos(2*pi * j * i /colums  + atan2(X[i].im, X[i].re));//整体计算误差会更小
            //verify[j].im += Amplitude * sin(2*pi * j * i /colums  + atan2(X[i].im, X[i].re));
            printf("(%f,%f,%f,%f,%f,%f)\n", Amplitude, Frequency,t, Phase, Re, Im);
        }
    }
    printf("\n");

    printf("验证结果:\n");
    for (int i = 0; i < colums; i++) {
        printf("(%f,%f)\n", verify[i].re, verify[i].im);
    }
    printf("\n");
}

 

 

标签:验证,int,C++,re,complex,im,colums,printf,傅里叶
From: https://www.cnblogs.com/lizhiqiang0204/p/17408559.html

相关文章

  • c++ gdiplus实现屏幕截图
    #include<windows.h>#include<gdiplus.h>#include<iostream>#include<filesystem>#include<chrono>#include<iomanip>#include<sstream>#pragmacomment(lib,"Gdiplus.lib")usingnamespaceGdiplus;U......
  • 【C++ Primer】第二章(2 ~ 6节)
    变量变量提供一个具名的、可供程序操作的存储空间。C++中变量和对象一般可以互换使用。变量定义(define)定义形式:类型说明符(typespecifier)+一个或多个变量名组成的列表。如intsum=0,value,units_sold=0;初始化(initialize):对象在创建时获得了一个特定的值。初......
  • 傅里叶级数展开
    傅里叶级数法国数学家傅里叶发现,任何周期函数都可以用正弦函数和余弦函数构成的无穷级数来表示。周期信号都可表示成为谐波关系的正弦信号的加权和,非周期信号都可用正弦信号的加权积分表示。频域分析:---傅里叶变换,自变量为 jW复频域分析:---拉氏变换,自变量为S=s+jWZ域分析:---Z......
  • CS106L: Standard C++ Programming, Special Edition
    课程内容涉及C++五大主题:C++介绍、Stream和Types、STL四大模块、OOP面向对象、高级特性(RAII、多线程、元编程)。本系列整合了CS106L课程公开的资料,系统完整的涵盖了C++核心内容,方便学习。搭配《C++Primer》,一起享用更佳!C++课程自学总结CS106L学习时间:刷课一周,复......
  • c++拼图小游戏
    文件目录结构  common.h#pragmaonce#include<iostream>#include<graphics.h>//图形库#include<array>//定长数组#include<algorithm>//乱序算法#include<functional>//仿函数#include<ctime>//时间time函数的头文件usingnamespacestd;//窗口属性类//窗口的宽和高#define......
  • C/C++银行账户管理系统程序[2023-05-06]
    C/C++银行账户管理系统程序[2023-05-06]编写一个银行账户管理系统程序。银行客户信息以一个账户一条记录的形式存储,每个账户记录包含的信息有身份标识号(ID)、姓名、电话、电子邮箱、身份证号、银行卡号、账户余额等信息。具体功能如下:对于银行客户实现①开户,若无账户,申请开户......
  • 手把手教你Tomcat配置环境变量以及验证方法
    场景现在要将Tomcat配置进环境变量。实现以win7为例,找到桌面计算机图表,右键属性。或者打开计算机,找到系统属性。然后找到高级系统设置找到环境变量点击系统变量下的新建找到Tomcat所在目录变量名为:CATALINA_BASE内容为Tomcat所在路径,这里是上面的路径如图:点击确定同理再新建系统变......
  • 1012 数字分类(C++)
    一、问题描述:给定一系列正整数,请按要求对数字进行分类,并输出以下5个数字:A1​ =能被5整除的数字中所有偶数的和;A2​ =将被5除后余1的数字按给出顺序进行交错求和,即计算 n1​−n2​+n3​−n4​⋯;A3​ =被5除后余2的数字的个数;A4​ =被5除后余3的数字......
  • C++学习简记Ⅱ
    二C++数组Array可以在堆(heap)上创建一个数组int*another=newint[5];//其作用域与在栈上创建不同,直到程序把它销毁之前,它都是处于活动状态的,需要用delete关键字来删除delete[]another;使用new动态分配最大的原因是生存期,用new来分配的内存,它将一直存在,直到手动删......
  • C++学习简记Ⅰ
    一指针内容在C中已经熟悉指针本身为一个代表地址的整数指针的*运算符通常被称为dereference运算符,可逆引用指针。引用引用必须引用已经存在的变量,其本身不是变量也不占用内存,相当于变量的别名使用int&类此的形式声明引用变量其作用为向函数传递变量,而不是只传递值,这使......