首页 > 编程语言 >手撕fft系列之频移fftshift源码解析

手撕fft系列之频移fftshift源码解析

时间:2023-02-03 11:13:26浏览次数:43  
标签:spx count int16 int 频移 fft fftshift 源码 data

壹: fft在数字信号处理领域是一个神一样的存在。要好好熟悉一下。这里给出频移的算法源码解析。 所谓的频移,就是把数字信号的频频顺序打乱,移动一些。这个在防止啸叫和辅听领域应用十分广泛。 贰: 这个源码不是很复杂,这里直接给出一个仿真源码:

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

typedef short spx_int16_t;
typedef spx_int16_t spx_word16_t;

void dump16(spx_word16_t *data,short len)
{
  for (short i = 0; i < len; i++)
  {
    /* code */
    printf("%d,",data[i]);
  }

  printf("\n\r");

}

void swap(spx_int16_t *v1, spx_int16_t *v2)
{
    spx_int16_t tmp = *v1;
    *v1 = *v2;
    *v2 = tmp;
}

void fftshift(spx_int16_t *data, int count)
{
    int k = 0;
    int c = (int) floor((float)count/2);
    // For odd and for even numbers of element use different algorithm
    if (count % 2 == 0)
    {
        for (k = 0; k < c; k++)
            swap(&data[k], &data[k+c]);
    }
    else
    {
        spx_int16_t tmp = data[0];
        for (k = 0; k < c; k++)
        {
            data[k] = data[c + k + 1];
            data[c + k + 1] = data[k + 1];
        }
        data[c] = tmp;
    }
}

void ifftshift(spx_int16_t *data, int count)
{
    int k = 0;
    int c = (int) floor((float)count/2);
    if (count % 2 == 0)
    {
        for (k = 0; k < c; k++)
            swap(&data[k], &data[k+c]);
    }
    else
    {
        spx_int16_t tmp = data[count - 1];
        for (k = c-1; k >= 0; k--)
        {
            data[c + k + 1] = data[k];
            data[k] = data[c + k];
        }
        data[c] = tmp;
    }
}

int main()
{
        spx_int16_t array[8] = {1,2,3,4,5,6,7,8};

        printf("before the fftshift is:\n\r");
        dump16(array,8);
        fftshift(array,8);
        printf("after the fftshift is:\n\r");
        dump16(array,8);

        return 0;
}
叁: 上面的结果是:
before the fftshift is:
1,2,3,4,5,6,7,8,
after the fftshift is:
5,6,7,8,1,2,3,4,

标签:spx,count,int16,int,频移,fft,fftshift,源码,data
From: https://www.cnblogs.com/dylancao/p/17088478.html

相关文章

  • 记一次在读Babel源码时遇到的闭包应用
    function_commander(){constdata=require("commander");_commander=function(){returndata;};returndata;}在函数里面对函数进行了重新赋......
  • libxml2-master源码下载及编译
    libxml2源码下载地址https://gitlab.gnome.org/GNOME/libxml2/-/releasesCMake(mainlyforWindows)AnotheroptionforcompilinglibxmlisusingCMake:cmake-Et......
  • openjdk@15源码-01调试源码
    openjdk@15源码-调试源码在调试jdk源码过程中可能需要追踪c/cpp甚至汇编指令,方便起见新建项目不需要package路径0Git可以直接clone我自己的代码https://github.com/Ba......
  • 10、获取一个网页的源码
    #获取一个网页的源码https://www.baidu.com/s?wd=%E5%91%A8%E6%9D%B0%E4%BC%A6importurllib.requesturl='https://www.baidu.com/s?wd='#要将周杰伦变为Unicode......
  • 一文讲尽Thread类的源码精髓
    摘要:今天,我们就一起来简单看看Thread类的源码。本文分享自华为云社区《【高并发】Thread类的源码精髓》,作者:冰河。前言最近和一个朋友聊天,他跟我说起了他去XXX公司面试......
  • 一文讲尽Thread类的源码精髓
    摘要:今天,我们就一起来简单看看Thread类的源码。本文分享自华为云社区《​​【高并发】Thread类的源码精髓​​》,作者:冰河。前言最近和一个朋友聊天,他跟我说起了他去XXX公司......
  • apiview、request、response源码分析、serializer基本使用
    昨日回顾#1restful规范 -https协议,保证安全-接口中带api标识 -api.baidu.com-www.baidu.com/api -接口中带版本标识-接口即资源,尽量用名......
  • 通过uboot传参设置mtd分区流程源码分析
    因为公司同事反映他使用的开板无法将根目录下的ip_work目mounth成功,由于本人当时没有去现场查看问题,只是象征性的询问内核是否创建了/dev/mtdblock5设备节点,因为该开发板默......
  • 直播商城系统源码,播放器aliPlayer自定义清晰度切换
    直播商城系统源码,播放器aliPlayer自定义清晰度切换 <!DOCTYPEhtml><html><head>  <metacharset="utf-8">  <metahttp-equiv="x-ua-compatible"content="IE=......
  • Quartz.Net源码Example之Quartz.Examples
    Quartz.Examples反射-Example批量执行​ 实现思路:定义一个统一的接口,需要实现的类全部实现该接口;通过反射获取实现该接口的实例并触发其中的方法。定义统一的接口//......