• BF518/BF516/BF514/BF512系列DSP的开发教程四十一:数字信号处理-FFT


    硬件准备

    BF518开发板

    产品链接:https://item.taobao.com/item.htm?id=39906148347&spm=a1z10.5-c.w4002-5192690539.11.22951471QbeGrA

    在这里插入图片描述

    BF518仿真器

    产品链接:https://item.taobao.com/item.htm?id=38007242820&spm=a1z10.5-c.w4002-5192690539.11.6e614901nd1XEO

    在这里插入图片描述
    FFT(Fast Fourier Transformation),即为快速傅氏变换,是离散傅氏变换的快速算法,它是根据离散傅氏变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的。

    代码实现了通过 Visual DSP++ 软件的 BTC(Background Telemetry Channels)功能进行后台监测,FFT 算法产生一个输入的波形数据,经计算后产生输出的波形数据,然后将输入和输出波形数据由 BTC 控制,通过视图实时输出显示。

    核心算法

    #include
    #include
    #include
    #include
    #include

    #include

    #define NUMPOINTS 512

    complex_fract16 out[NUMPOINTS];
    complex_fract16 w[NUMPOINTS]; //twiddle sequence

    fract16 input_arr[NUMPOINTS];
    fract16 mag[NUMPOINTS];

    #define MINFREQ 100.0
    #define MAXFREQ 20000.0


    // BTC Definitions

    fract16 BTC_CHAN0[NUMPOINTS+8];
    fract16 BTC_CHAN1[NUMPOINTS+8];
    int BTC_CHAN2 = 0x10;

    BTC_MAP_BEGIN
    // Channel Name, Starting Address, Length
    BTC_MAP_ENTRY(“FFT_INPUT”, (long)&BTC_CHAN0, sizeof(BTC_CHAN0))
    BTC_MAP_ENTRY(“FFT_OUTPUT”, (long)&BTC_CHAN1, sizeof(BTC_CHAN1))
    BTC_MAP_ENTRY(“FREQ STEP SIZE”, (long)&BTC_CHAN2, sizeof(BTC_CHAN2))
    BTC_MAP_END


    // function prototypes

    void initTimer(void);
    void create_samples(float f);

    /
    // interrupt handler prototypes
    /
    EX_INTERRUPT_HANDLER(timerISR); // timer interrupt handler

    void main()
    {
    int i,j;
    int wst = 1;
    int n = NUMPOINTS;
    int block_exponent;
    int scale_method = 1;
    float freq;

    btc_init();
    	
    // install our interrupt handlers
    register_handler(ik_timer, timerISR);
    
    //init twiddle factors
    twidfftrad2_fr16(w, NUMPOINTS);
    
    //increment freq
    freq = MINFREQ;
    create_samples(freq);
    
    // initialize the timer and the programmable flags
    initTimer();
    
    while (1) {
    	
    	//generate input
    	create_samples(freq);
    	
    	//fft
    	rfft_fr16(input_arr, out, w, wst, n, &block_exponent, scale_method);
    
    	for (i=0; i MAXFREQ) freq = MINFREQ;
    	
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    }

    void create_samples(float f)
    {
    int i,j;

    float fs = 48000.0;
    float step;
    
    //generate input
    for (i=0; i
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    }

    //
    // initTimer
    //
    void initTimer()
    {
    unsigned int *mmrPtr;

    mmrPtr = (unsigned int*)0xffe03000;		// timer control register
    *mmrPtr = 5;							
    
    mmrPtr = (unsigned int*)0xffe03004;		// timer period register
    *mmrPtr = 0x00001000;
    
    mmrPtr = (unsigned int*)0xffe03008;		// timer scale register
    *mmrPtr = 0x00000000;
    
    mmrPtr = (unsigned int*)0xffe0300c;		// timer count register
    *mmrPtr = 0x00001000;
    
    mmrPtr = (unsigned int*)0xffe03000;		// timer control register
    *mmrPtr = 7;							// enable the timer
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    }


    // timer interrupt handler

    EX_INTERRUPT_HANDLER(timerISR)
    {
    btc_poll();
    }

    操作步骤
    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    打开 BTC Memory 窗口

    在这里插入图片描述

    在这里插入图片描述

    选中 FFT OUT 波形视图框,按鼠标右键,选择“Auto Refresh Settings…”选项。

    在这里插入图片描述

    在弹出会话框中,按如下设置,完后后点“OK”

    在这里插入图片描述

    再次调出鼠标右键菜单,选择“Auto Refresh”

    在这里插入图片描述

    用同样的方法,对 FFT IN 波形视图框进行设置。

    选中 BTC Memory 窗口,鼠标右键调出菜单,选择格式为“Hex32”

    在这里插入图片描述

    选中后 BTC Memory 窗口以 32bit 显示。

    在这里插入图片描述

    选中 BTC Memory 下拉菜单,选择“FREQ STEP SIZE”。

    在这里插入图片描述

    在下面的地址中输入 10~100 任意数据,来设置改变波形和数据刷新的频率。

    在这里插入图片描述

    全速运行代码。

    运行代码后,在两个波形窗口中可以看到变化的波形图像。

    在这里插入图片描述

    BTC 窗口检测到的 FFT_INPUT 的数据:

    在这里插入图片描述

    BTC 窗口检测到的 FFT_OUTPUT 的数据:

    在这里插入图片描述

  • 相关阅读:
    抖音账号矩阵系统开发源码
    Spring Boot项目的搭建和运行
    【Leetcode】149.直线上最多的点数(Hard)
    【电源专题】线性稳压器基础(线性稳压器是哪里线性了?)
    说一说MVCC多版本并发控制器?
    设计模式之代理模式(十一)
    63. 不同路径 II
    【排序算法】快速排序
    又解锁了一种OpenFeign的使用方式!
    【地平线 开发板】实现模型转换并在地平线开发板上部署的全过程操作记录(魔改开发包)
  • 原文地址:https://blog.csdn.net/ADI_OP/article/details/136307144