打印
[应用相关]

基于STM32单片机的FFT算法

[复制链接]
楼主: hanzhen654
手机看帖
扫描二维码
随时随地手机跟帖
21
hanzhen654|  楼主 | 2019-11-27 10:18 | 只看该作者 回帖奖励 |倒序浏览
添加串口驱动,对于正点原子的工程,在system文件夹中已经加入串口1的驱动,直接就可以使用串口1。
对串口进行初始化,保证串口可用。
int main(void)
{       
        delay_init();            //延时函数初始化          
        LED_Init();                          //初始化与LED连接的硬件接口
        uart_init(9600);  //初始化串口 9600波特率
        printf("这是一个FFT 测试实验\r\n");
        while(1)
        {
                LED0=0;
                LED1=1;
                delay_ms(300);         //延时300ms
                LED0=1;
                LED1=0;
                delay_ms(300);        //延时300ms
        }
}

使用特权

评论回复
22
hanzhen654|  楼主 | 2019-11-27 10:19 | 只看该作者
3.3添加测试数据集,验证256点的FFT函数,填充输入数组
//填入数组                                                                                                                               
void InitBufInArray()
{
unsigned short i;
float fx;
for(i=0; i<N; i++)   
        {
        fx = 1500 * sin(PI2 * i * 350.0 / Fs) +
             2700 * sin(PI2 * i * 8400.0 / Fs) +
             4000 * sin(PI2 * i * 18725.0 / Fs);
                    FFT_256PointIn[i] = ((signed short)fx) << 16;
    }       
}       

使用特权

评论回复
23
hanzhen654|  楼主 | 2019-11-27 10:19 | 只看该作者
3.4计算各次谐波幅值,先将lBufOutArray分解成实部(X)和虚部(Y),然后计算幅值(sqrt(X*X+Y*Y)。
void GetPowerMag()
{
    signed short lX,lY;
    float X,Y,Mag;
    unsigned short i;
    for(i=0; i<N/2; i++)
    {
        lX  = (FFT_256PointOut[i] << 16) >> 16;
        lY  = (FFT_256PointOut[i] >> 16);
        X = N * ((float)lX) / 32768;
        Y = N * ((float)lY) / 32768;
        Mag = sqrt(X * X + Y * Y) / N;
        if(i == 0)
            lBufMagArray[i] = (unsigned long)(Mag * 32768);
        else
            lBufMagArray[i] = (unsigned long)(Mag * 65536);
                               
                                printf("%d      ",i);
                                printf("%d      ",F*i);
                                printf("%d      ",lBufMagArray[i]);
                                printf("%d      ",lX);
                                printf("%d      \r\n",lY);                       
    }
}

使用特权

评论回复
24
hanzhen654|  楼主 | 2019-11-27 10:20 | 只看该作者
3.5主函数测试,先填充输入数组再做fft256点运算,最后求出赋值,打印测试。
int main(void)
{       
        delay_init();            //延时函数初始化          
        LED_Init();                          //初始化与LED连接的硬件接口
        uart_init(9600);  //初始化串口 9600波特率
        printf("这是一个FFT 测试实验\r\n");  
    InitBufInArray();
        cr4_fft_256_stm32(FFT_256PointOut, FFT_256PointIn,N);         
        printf("点数   频率  幅值   实部  虚部\n");
        GetPowerMag();
               
                  while(1)
                 {
                                LED0=0;
                                LED1=1;
                                delay_ms(300);         //延时300ms
                                LED0=1;
                                LED1=0;
                                delay_ms(300);        //延时300ms
                        }
}

使用特权

评论回复
25
hanzhen654|  楼主 | 2019-11-27 10:21 | 只看该作者
串口测试界面如下:
点数   频率   幅值    实部   虚部
0      0        4       0       -4      
1      175      14        -6      -4      
2      350      1500      -380      647      
3      525      11      -5      -3      
4      700      10      -4      -3      
5      875      8      -4      -2      
6      1050      8      -4      -1      
7      1225      6      -3      0      
8      1400      8      -3      -3      
9      1575      8      -4      -1      
10      1750      8      -4      -1      
11      1925      8      -4      0      
12      2100      5      -2      -2      
13      2275      6      -3      -1      
14      2450      8      -3      -3      
15      2625      7      -3      -2      
16      2800      5      -2      -2      
17      2975      6      -3      -1      
18      3150      6      -3      0      
19      3325      6      -3      0      
20      3500      6      -3      -1      
21      3675      6      -3      0      
22      3850      6      -3      0      
23      4025      2      -1      0      
24      4200      6      -3      -1      
25      4375      6      -3      0      
26      4550      4      -2      0      
27      4725      4      -2      0      
28      4900      2      -1      -1      
29      5075      4      -2      0      
30      5250      2      -1      0      
31      5425      4      -2      0      
32      5600      2      -1      0      
33      5775      6      -3      -1      
34      5950      6      -3      0      
35      6125      6      -3      -1      
36      6300      4      -2      -1      
37      6475      6      -3      0      
38      6650      4      -2      0      
39      6825      6      -3      0      
40      7000      5      -2      -2      
41      7175      6      -3      0      
42      7350      2      0      -1      
43      7525      6      -3      0      
44      7700      2      -1      -1      
45      7875      4      -2      0      
46      8050      6      -3      -1      
47      8225      2      -1      0      
48      8400      2704      -676      -1171      
49      8575      4      -2      0      
50      8750      2      -1      0      
51      8925      4      -2      -1      
52      9100      2      -1      -1      
53      9275      4      -2      0      
54      9450      2      -1      0      
55      9625      2      -1      -1      
56      9800      2      -1      -1      
57      9975      4      -2      0      
58      10150      2      0      -1      
59      10325      4      -2      0      
60      10500      2      -1      -1      
61      10675      2      -1      -1      
62      10850      4      -2      -1      
63      11025      2      -1      -1      
64      11200      0      0      0      
65      11375      2      -1      0      
66      11550      4      -2      0      
67      11725      2      0      -1      
68      11900      2      -1      -1      
69      12075      2      -1      1      
70      12250      2      -1      1      
71      12425      4      -2      1      
72      12600      4      -2      -1      
73      12775      2      -1      1      
74      12950      2      -1      -1      
75      13125      4      -2      1      
76      13300      2      -1      -1      
77      13475      4      -2      1      
78      13650      2      -1      -1      
79      13825      4      -2      0      
80      14000      2      -1      0      
81      14175      4      -2      0      
82      14350      4      -2      1      
83      14525      4      -2      1      
84      14700      2      -1      0      
85      14875      2      -1      1      
86      15050      4      -2      0      
87      15225      4      -2      0      
88      15400      2      -1      -1      
89      15575      4      -2      1      
90      15750      2      -1      1      
91      15925      2      -1      1      
92      16100      0      0      0      
93      16275      4      -2      1      
94      16450      2      -1      1      
95      16625      4      -2      1      
96      16800      2      -1      0      
97      16975      4      -2      0      
98      17150      4      -2      1      
99      17325      4      -2      0      
100      17500      2      -1      0      
101      17675      4      -2      0      
102      17850      2      -1      0      
103      18025      4      -2      0      
104      18200      4      -2      -1      
105      18375      4      -2      1      
106      18550      2      -1      -1      
107      18725      3996      1998      1      
108      18900      2      -1      0      
109      19075      2      -1      1      
110      19250      4      -2      0      
111      19425      4      -2      1      
112      19600      2      -1      0      
113      19775      2      -1      1      
114      19950      2      -1      1      
115      20125      4      -2      1      
116      20300      0      0      0      
117      20475      4      -2      1      
118      20650      2      -1      1      
119      20825      2      0      1      
120      21000      2      -1      0      
121      21175      2      -1      1      
122      21350      2      -1      0      
123      21525      4      -1      2      
124      21700      2      -1      0      
125      21875      2      0      1      
126      22050      2      -1      0      
127      22225      2      0      1      

使用特权

评论回复
26
hanzhen654|  楼主 | 2019-11-27 10:21 | 只看该作者
由以上的实验数据,我们可以看出,在频率为350Hz,8400Hz和18725Hz时,幅值出现峰值,分别为1500、2696和3996,这与我们所预期的结果正好相符,从而验证了实验结果的正确性。

使用特权

评论回复
27
zjq985062714| | 2019-11-30 10:00 | 只看该作者
好复杂啊。。。

使用特权

评论回复
28
labasi| | 2019-12-10 13:51 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
29
keaibukelian| | 2019-12-10 13:54 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
30
heimaojingzhang| | 2019-12-10 13:57 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
31
guanjiaer| | 2019-12-10 14:04 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
32
shidalin| | 2019-12-16 13:47 | 只看该作者
楼主你好,我用这种方法计算幅值后,数值波动比较严重,我发现问题是在没有模拟量输入的时候FFT后的结果也不是零,从你25楼的数据也可以看出这一点,我想问下有什么好的方法能去除这些数据,让数值稳定吗?

使用特权

评论回复
33
yingyingying| | 2020-2-17 14:34 | 只看该作者
楼主能详解一下计算幅值的方法吗

使用特权

评论回复
34
仰望星期五| | 2020-4-27 14:48 | 只看该作者
本帖最后由 仰望星期五 于 2020-4-27 15:00 编辑

https://blog.csdn.net/helenie/article/details/53442507
是不是复制粘贴的这个,**中有好几个关键性的变量都没有提及。又发现一个类似的**,是2016年发布的。。。https://blog.csdn.net/iloveyoumj/article/details/53308142

使用特权

评论回复
35
liubo0702| | 2020-5-7 17:40 | 只看该作者
你好,你的工程可否发我一下,我配置的跑不起来  1831696457@QQ.COM

使用特权

评论回复
36
dev1255874908| | 2020-7-3 16:57 | 只看该作者
好贴 MARK

使用特权

评论回复
37
51xlf| | 2020-7-3 22:08 | 只看该作者
            

使用特权

评论回复
38
hanzhen654|  楼主 | 2020-12-20 14:23 | 只看该作者

感谢支持,这个是我自己做的,代码自己实现的。

使用特权

评论回复
39
hanzhen654|  楼主 | 2020-12-20 14:24 | 只看该作者

此处是不是需要管理员加精华啊,感觉自己写的不错

使用特权

评论回复
40
hanzhen654|  楼主 | 2020-12-20 14:25 | 只看该作者
liubo0702 发表于 2020-5-7 17:40
你好,你的工程可否发我一下,我配置的跑不起来  1831696457@QQ.COM ...

可以使用DSP包,或者自己使用C来实现FFT算法

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则