标题:
STM32写的频谱仪的代码
[打印本页]
作者:
heroshi
时间:
2017-4-18 10:46
标题:
STM32写的频谱仪的代码
STM32写的频谱仪的代码
0.png
(59.34 KB, 下载次数: 65)
下载附件
2017-4-19 03:54 上传
全部源码下载:
STM32Spectrum.rar
(356.87 KB, 下载次数: 72)
2017-4-18 10:45 上传
点击文件名下载附件
频谱代码
下载积分: 黑币 -5
预览:
/************************************************************
**注意事项:系统直接集成TFF文件系统
**版本:V1.0
**日期:09-6-10
*************************************************************/
#include "STM32Lib\\stm32f10x.h"
#include "hal.h"
#include <stdio.h>
#include "TFT\\TFTdriver.h"
#include "fft\\FFTInc.h"
//-------------------------------主程序--------------------------------------------------
unsigned int FFT_N = 128; //初始化128点
unsigned int ActualBuf[MAX_FFT_N]; //实部
unsigned int ImagBuf[MAX_FFT_N]; //虚部
unsigned int FFT_dat_W ; //-- 数据宽度
unsigned char Distance ; //-- 频谱条间隔距离
unsigned char Article_W ; //-- 频谱条宽度
unsigned char DOWN_SP ; //-- 频谱条跌落速度
unsigned char DOWN_bit ; //-- 频谱点跌落速度
unsigned char MAX_bit_del ; //-- 频谱点跌维持时间
unsigned int TFT_FFT_H ; //-- 频谱显示区高度
unsigned char FFT_Bit;
unsigned char show_sav[MAX_FFT_N/2]; //--频谱条缓存
unsigned int show_bit[MAX_FFT_N/2]; //--频谱点缓存
void FFT_Show_Init( unsigned int n )
{
unsigned int i;
FFT_dat_W = n / 2; //-- 数据宽度
Distance = 320 / FFT_dat_W ; //-- 频谱条间隔距离
switch( n )
{
case 16:
Article_W = Distance - 3; //--
DOWN_SP = 1; //--
DOWN_bit = 2; //--
MAX_bit_del = 45; //--
FFT_Bit = 4 ; //--
break;
case 32:
Article_W = Distance - 2;
DOWN_SP = 1 ; //
DOWN_bit = 2 ; //
MAX_bit_del = 40 ; //
FFT_Bit = 5 ;
break;
case 64:
Article_W = Distance - 1;
DOWN_SP = 1 ; //
DOWN_bit = 2 ; //
MAX_bit_del = 35 ; //
FFT_Bit = 6 ;
break;
case 128:
Article_W = Distance - 1;
DOWN_SP = 1 ; //
DOWN_bit = 2 ; //
MAX_bit_del = 30 ; //
FFT_Bit = 7 ;
break;
case 256:
Article_W = Distance - 1;
DOWN_SP = 2 ; //
DOWN_bit = 3 ; //
MAX_bit_del = 25 ; //
FFT_Bit = 8 ;
break;
case 512:
Article_W = Distance;
DOWN_SP = 3 ; //
DOWN_bit = 4 ; //
MAX_bit_del = 20 ; //
FFT_Bit = 9 ;
break;
}
TFT_FFT_H = 239 - DOWN_bit - 1; //-- 频谱显示区高度
for ( i = 0 ;i < MAX_FFT_N / 2;i ++ )
{
show_bit[ i ] = show_sav[ i ] = 0;
}
}
//--------------???--??---------------//
union{
struct{
unsigned B_dat :8; //--
unsigned B_del :8; //--
}Bit_bit;
unsigned int Bit_bits;
}Bit_dat; //---
void FFT_Show( unsigned int *buf )
{
int i,j,dat;
for ( i = 1,j = 0;i < FFT_dat_W ;i ++,j += Distance ) //--
{
Bit_dat.Bit_bits = show_bit[ i ]; //--
TFTRectFill( Bit_dat.Bit_bit.B_dat, j , Bit_dat.Bit_bit.B_dat + DOWN_bit + 1,j + Article_W, BLACK,0);//--擦除无效点
TFTRectFill( show_sav[i], j , show_sav[i] + DOWN_bit, j + Article_W, BLACK,0);//--擦除无效频谱条
if ( buf[ i ] > TFT_FFT_H ) dat = TFT_FFT_H; //--限制频谱条数据在工作区范围内
else
dat = buf[i];
// buf[i] = 0; //--
if ( show_sav[i] < dat ) //--有新的频谱条出现
{
TFTRectFill(show_sav[i],j,dat,j + Article_W,RED_BRIGHT,0); //-- 先刷差值
show_sav[i] = dat; //-- 再保存新值
}
if ( Bit_dat.Bit_bit.B_dat < dat ) //--有新的频谱点出现(不和频谱条一起刷新)
{
Bit_dat.Bit_bit.B_dat = dat; //--刷新频谱点
Bit_dat.Bit_bit.B_del = MAX_bit_del; //--频谱点维持时间刷新
}
//---- 刷频谱点
TFTRectFill(Bit_dat.Bit_bit.B_dat,j,Bit_dat.Bit_bit.B_dat+1,j + Article_W,GREEN,0);
if ( show_sav[i] >= DOWN_SP ) show_sav[i] -= DOWN_SP; //频谱条跌落
else show_sav[i] = 0;
if ( Bit_dat.Bit_bit.B_del ) Bit_dat.Bit_bit.B_del --;//--频谱点维持
else
if ( Bit_dat.Bit_bit.B_dat - DOWN_bit > show_sav[i] ) //--防止点跌落超过条
{
if ( Bit_dat.Bit_bit.B_dat >= DOWN_bit )
Bit_dat.Bit_bit.B_dat -= DOWN_bit; //频谱点跌落
else
Bit_dat.Bit_bit.B_dat = 0;
}
else //--点跌落到条顶部后,再维持
Bit_dat.Bit_bit.B_del = MAX_bit_del;
show_bit[i] = Bit_dat.Bit_bits; //--保存变量
}
}
unsigned char luv = 0;
extern unsigned int adcread(void);
int main(void)
{
ChipHalInit();
ChipOutHalInit();
Lcd_Init(); //初始化
FFT_read:
TFTFill(0,0,240,320,BG_COLOR);
FFT_Show_Init( FFT_N );
Int_FFT_TAB( FFT_N );
for(;;)
{
int i;
int del;
for ( i = 0;i < FFT_N; i++ )
{
ActualBuf [i]= adcread(); // 音频实部
ImagBuf[i] = 0; // 音频虚部
del = 520; // 音频采样速率
while(del--);
}
fft( (int *)ActualBuf, (int *)ImagBuf, FFT_Bit, FFT_N );//fft
//--平滑处理
if ( GET_LEFT() ) luv = 1;
if ( GET_RIGHT() ) luv = 0;
//--FFT点数切换 +
if ( GET_UP() )
{
if ( FFT_N < MAX_FFT_N ) FFT_N <<= 1;
else FFT_N = MIN_FFT_N;
while( GET_UP() );
goto FFT_read;
}
//--FFT点数切换 -
if ( GET_DOWN() )
{
if ( FFT_N > MIN_FFT_N ) FFT_N >>= 1;
while( GET_DOWN() );
goto FFT_read;
}
if ( luv ) //--简单的平滑处理
{
for ( i = 2;i < FFT_N;i ++ )
{
if ( ImagBuf[ i-1 ] > ImagBuf[ i ] ) //-- 前一通道 大于当前通道 ,对当前通道进行提升
{
ImagBuf[ i ] += ( ( ImagBuf[ i-1 ] - ImagBuf[ i ]) >> 1 ) ;
}
if ( ImagBuf[ i-1 ] < ImagBuf[ i ] ) //-- 当前通道 大于 前一通道,对前一通道进行提升
{
ImagBuf[ i-1 ] += ( ( ImagBuf[ i ] - ImagBuf[ i-1 ] ) >> 1);
}
}
}
FFT_Show( ImagBuf );
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
作者:
alai318
时间:
2017-4-19 09:57
學習了,這資料正好有用
作者:
骆驼驼
时间:
2017-12-20 09:55
学习了,谢谢楼主分享
作者:
wxdwxd090503
时间:
2020-4-14 13:55
正在研究
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1