首页 > 编程语言 >C++ 傅里叶频谱的计算以及应用

C++ 傅里叶频谱的计算以及应用

时间:2023-07-12 10:48:34浏览次数:43  
标签:频谱 int ++ C++ re complex im colums 傅里叶

一维傅里叶频谱的计算

#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;
}

/// <summary>
/// 离散傅里叶变换
/// </summary>
/// <param name="f">时域数据</param>
/// <param name="F">频域数据</param>
/// <param name="N">数据长度</param>
void dft(complex f[], complex F[], int N)
{
    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(f[n], temp));
        }
    }
}

/// <summary>
/// 离散傅里叶逆变换
/// </summary>
/// <param name="F">频域数据</param>
/// <param name="f">时域数据</param>
/// <param name="N">数据长度</param>
void idft(complex F[], complex f[], int N) {
    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(F[n], temp));
        }
        f[k].re /= N;
        f[k].im /= N;
    }
}

/// <summary>
/// 将零频分量移到频谱中心
/// </summary>
/// <param name="F">频域数据</param>
/// <param name="Shift">零频分量移到频谱中心的数据</param>
/// <param name="N">数据长度</param>
void fftshift(complex F[], complex Shift[], int N) {
    for (int i = 0; i < N; i++) {
        int shiftIndex = (i + (N - 1) / 2 + 1) % N;
        Shift[i] = F[shiftIndex];
    }
}

/// <summary>
/// 计算功率谱函数
/// </summary>
/// <param name="F">零频分量移到频谱中心的数据</param>
/// <param name="P">功率谱数据</param>
/// <param name="N">数据长度</param>
void powerSpectrum(complex F[], float P[], int N) {
    for (int i = 0; i < N; i++) {
        P[i] = F[i].re * F[i].re + F[i].im * F[i].im;
    }
}

int main() {
    complex samples[colums], X[colums], x[colums]; //samples[]示例

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

    complex ShiftX[colums];
    fftshift(X, ShiftX, colums);
    printf("零频分量移到频谱中心 FFTShift:\n");
    for (int i = 0; i < colums; i++) {
        printf("(%f,%f)\n", ShiftX[i].re, ShiftX[i].im);
    }
    printf("\n");

    float PowerX[colums];
    powerSpectrum(ShiftX, PowerX, colums);
    printf("功率谱 powerSpectrum:\n");
    for (int i = 0; i < colums; i++) {
        printf("(%f)\n", PowerX[i]);
    }
    printf("\n");
 
}
View Code

运行结果

 

标签:频谱,int,++,C++,re,complex,im,colums,傅里叶
From: https://www.cnblogs.com/lizhiqiang0204/p/17546884.html

相关文章

  • Qt/C++音视频开发46-音视频同步保存到MP4
    一、前言用ffmpeg单独做视频保存不难,单独做音频保存也不难,难的是音视频同步保存到MP4中,重点是音视频要同步,其实这也不难,只要播放那边音视频同步后的数据,写入到文件即可。最难的是在播放过程中不断随机的切换播放进度,而且还会暂停播放、暂停录制的情况出现,这些个复杂情况的出现,可......
  • 编程基础——计算机、程序和C++语言简介
    编程(programming)的意思是创建(或开发)软件,软件也称为程序(program)。软件是一个包含指令的集合,这些指令告诉计算机,或者计算设备,应该做什么。软件设计者使用一种强大的工具——程序设计语言(programminglanguage)开发出这些软件。没有最棒的编程语言,一种编程语言在某些情况下可......
  • C++面试八股文:知道std::unordered_set/std::unordered_map吗?
    C++面试八股文:知道std::unordered_set/std::unordered_map吗?某日二师兄参加XXX科技公司的C++工程师开发岗位第27面:面试官:知道std::unordered_set/std::unordered_map吗?二师兄:知道。两者都是C++11引入的新容器,和std::set和std::map功能类似,key唯一,unordered_map的value可变。......
  • c++ day7
    今天还是来理解空间复杂度其实就是开摆一天当讨论空间复杂度时,我们可以通过具体的代码示例来说明不同情况下的空间复杂度。示例1:常数空间复杂度O(1)voidprintNumber(intnum){intcount=0;//常数级别的额外空间for(inti=0;i<num;i++){......
  • C/C++2022级C语言课程设计任务书[2023-07-06]
    C/C++2022级C语言课程设计任务书[2023-07-06]2022级C语言课程设计任务书【题目1】学籍管理系统一、设计题目学籍管理系统(用动态结构体数组实现)二、设计内容【题目描述】假设某校学生学籍基本信息主要包括:学号(整型)、姓名(字符数组型)、所在系、班级等,本系统应能对这些......
  • C++自助点餐系统[2023-07-06]
    C++自助点餐系统[2023-07-06]面向对象程序课程设计任务书【题目】自助点餐系统【目的】通过设计一个小型的自助点餐系统,训练综合运用所学知识处理实际问题的能力,强化面向对象的程序设计理念,使自己的程序设计与调试水平有一个明显的提高。【要求】1、每个学生必须独立完成;2......
  • C++停车场管理系统[2023-07-06]
    C++停车场管理系统[2023-07-06]停车场管理系统简介一、 问题描述设停车场是一个可停放若干辆辆汽车的狭多层平面区域,且只有一个大门可供汽车进出。若车场内已停满汽车,则后来的汽车只能在门外的狭长便道上等候,一旦停车场内有车开走,则排在便道上的第一辆车即可进入。每辆停放在车......
  • 《C++程序设计》[2023-07-06]
    《C++程序设计》[2023-07-06]智能与工程学院《C++程序设计》小组学习任务书第2次专业年级:2022级计算机指导教师:李佳佳2022-2023学年第2学期一、任务根据课程所学,利用C++泛型编程思想、STL、模板、I\O流和异常处理等,以小组为单位完成基于STL泛化......
  • 【C++学习笔记——前置声明:解决嵌套引用问题】
    在代码中,两个类相互引用的问题,那么我们就需要在头文件中相互写#include,这样会造成相互循环cpoy头文件,编译器报错,为了解决这个问题,设置了前置声明这个方法。A.h#ifndefA_H#defineA_HclassBclassA{typedefvector<string>::sizetypesize_type;B*b;}#endifB.h#if......
  • C/C++学生成绩管理系统[2023-07-06]
    C/C++学生成绩管理系统[2023-07-06]学生成绩管理系统开发一个可以管理学生成绩以及学生基本信息的一个信息系统,至少实现如下功能:信息管理,支持信息的增、删、改、查操作,具体信息类型如下:(1) 管理学生信息 ,包括学号,姓名,年龄,班级等等信息。(2) 班级信息,包括班级编号、班级人数,......