• 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 的数据:

    在这里插入图片描述

  • 相关阅读:
    PyQt5中的分割线与spacer
    多元宇宙算法求解多目标优化问题附matlab代码(Multi-VerseOptimizer,MVO)
    【MySQL高级篇】一文带你吃透数据库和表的操作之DDL|实战案例详解
    commonJs和es6的区别
    cf F. Kazaee(离散化随机hashing+树状数组)
    【定时同步系列9】QPSK基带调制+Gardener定时误差检测+解调误码率曲线之MATLAB并行仿真姊妹篇二
    web前端页面基础
    关于PCB的工艺注意事项
    工商银行卡安全码怎么看
    区块链解决方案-最新全套文件
  • 原文地址:https://blog.csdn.net/ADI_OP/article/details/136307144