久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
STM32F1DMA方式ADC采集雙聲道音頻FFT變換顯示頻譜 源程序
[打印本頁]
作者:
新洲羅遠
時間:
2021-1-21 15:48
標題:
STM32F1DMA方式ADC采集雙聲道音頻FFT變換顯示頻譜 源程序
STM32F103C8_DMA方式2路ADC采集雙聲道音頻FFT變換顯示頻譜
這是一個完整的項目,沒有加狗
關鍵點在于多路采集,FFT庫函數應用,這個FFT函數用匯編優化,速度比較快。
當然,本系統速度瓶頸在畫點顯示。后期我采用直接寫顯存,就比較快了。
上段忙,這也是我對同道的一點小小的貢獻
51hei圖片20210121160005.jpg
(130.86 KB, 下載次數: 83)
下載附件
2021-1-21 16:00 上傳
單片機源程序如下:
#include "stm32f10x.h"
#include "usart.h"
#include "adc.h"
#include "delay.h"
#include "Lcd_Driver.h"
#include "LCD_Config.h"
#include "stm32_dsp.h"
#include "math.h"
#define NPT 256 //FFT采樣點數
long lBUFMAG[NPT+NPT]; //存儲求模后的數據[NPT+NPT/2]
long lBUFOUT[NPT]; //FFT輸出序列NPT=256
long lBUFIN0[NPT]; //FFT輸入系列
long lBUFIN1[NPT]; //FFT輸入系列
void dsp_column0(void);
void dsp_column1(void);
void powerMag(long nfill);//計算頻點幅值
void dsp_column_1(void);
void OLED_Fill(u8 x1,u8 y1,u8 x2,u8 y2,u16 dot);
extern __IO uint16_t ADC_ConvertedValue[NOFCHANEL];
// 局部變量,用于保存轉換計算后的電壓值
float ADC_ConvertedValueLocal[NOFCHANEL];
int main(void)
{
u16 i;
uart_init(115200);
ADCx_Init();
delay_init();
Lcd_Init();//初始化硬件SPI
Lcd_Clear(BLUE); //清屏函數
while(1)
{
ADC_SoftwareStartConvCmd(ADC_x, ENABLE);
while(!DMA_GetFlagStatus(DMA1_FLAG_TC1));
DMA_ClearFlag(DMA1_FLAG_TC1);
ADC_SoftwareStartConvCmd(ADC1, DISABLE);
ADC_ConvertedValueLocal[0] =(float) ADC_ConvertedValue[0]/4096*3.3;
ADC_ConvertedValueLocal[1] =(float) ADC_ConvertedValue[1]/4096*3.3;
printf("CH0 = %f V \r\n",ADC_ConvertedValueLocal[0]);
printf("CH1 = %f V \r\n",ADC_ConvertedValueLocal[1]);
for(i=0;i<NPT;i++)
{// 由于沒有采用外部觸發,所以使用軟件觸發ADC轉換
ADC_SoftwareStartConvCmd(ADC_x, ENABLE);
while(!DMA_GetFlagStatus(DMA1_FLAG_TC1));
DMA_ClearFlag(DMA1_FLAG_TC1);
ADC_SoftwareStartConvCmd(ADC1, DISABLE);
lBUFIN0[i] =(float) ADC_ConvertedValue[0];
lBUFIN1[i] =(float) ADC_ConvertedValue[1];
}
cr4_fft_256_stm32(lBUFOUT,lBUFIN1,NPT);//調用STM32的DSP庫作FFT變換
powerMag(NPT);//計算頻點幅值
dsp_column1();//顯示x根柱條。
cr4_fft_256_stm32(lBUFOUT,lBUFIN0,NPT);//調用STM32的DSP庫作FFT變換
//(FFT輸出序列,輸入序列,NPT=256)
powerMag(NPT);//計算頻點幅值
dsp_column0();//顯示x根柱條。
}
}
//顯示各頻點的柱條
void dsp_column0(void)
{
u8 i,j=80;
for(i=1;i<161;i+=2)
{ OLED_Fill(i,0,i,128,0x0000); //填充區域的對角坐標
OLED_Fill(i,0,i,lBUFMAG[j],RED); //填充區域的對角坐標
j --;
}
}
//顯示各頻點的柱條
void dsp_column1(void)
{
u8 i,j=80;
for(i=0;i<160;i+=2)
{ OLED_Fill(i,0,i,128,0x0000); //填充區域的對角坐標
OLED_Fill(i,0,i,lBUFMAG[j],GREEN); //填充區域的對角坐標
j --;
}
}
//x1,y1,x2,y2 填充區域的對角坐標
//確保x1<=x2;y1<=y2 0<=x1<=127 0<=y1<=63
//dot:0,清空;1,填充
void OLED_Fill(u8 x1,u8 y1,u8 x2,u8 y2,u16 dot) //可以快
{
u8 x,y;
for(x=x1;x<=x2;x++)
{
for(y=y1;y<=y2;y++) Gui_DrawPoint(x,y,dot);//畫一個點
}
}
////////////////////////////////////////////
//計算各頻點的模值
void powerMag(long nfill) //計算頻點幅值
{ int32_t lX,lY;
uint32_t i,j;
for (i=0; i < nfill; i++) //256
{
lX= (lBUFOUT[i]<<16)>>16; /* sine_cosine --> cos */
lY= (lBUFOUT[i] >> 16); /* sine_cosine --> sin */
{
float X= 64*((float)lX)/32768;
float Y = 64*((float)lY)/32768;
float Mag = sqrt(X*X+ Y*Y)/nfill; // 先平方和,再開方sqrt
j= (long)(Mag*65536); //存儲求模后的數據
if(j>128) j=128;//避免顯示越界
lBUFMAG[i] =j;
}
}
}
復制代碼
所有程序51hei提供下載:
DMA2通道ADC_FFT.7z
(216.08 KB, 下載次數: 169)
2021-1-21 16:46 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
楊雪飛
時間:
2021-1-21 19:09
雖然不懂stm32,還是強烈支持一下。
作者:
liesnake
時間:
2021-1-22 20:12
這個不錯的,很好的東西。
作者:
wangsh
時間:
2021-1-27 23:06
thank you very much!!!!!!!!!
作者:
羅程峰8200
時間:
2021-1-28 08:14
加油,雖然我不會玩,看看也好
作者:
VB老哥
時間:
2021-1-28 20:36
謝謝提供思路
歡迎光臨 (http://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
国产精品成人免费视频
|
久久riav
|
日韩精品一区二区视频
|
国产www视频
|
欧美xx孕妇
|
大尺度性做爰的小说金陵春
|
亚洲国产日韩在线
|
黄色福利视频
|
在线看日韩
|
久久精品视频99
|
黄色小视频在线观看免费
|
艳妇乳肉亭妇荡乳av
|
成人一区二区三区
|
福利视频网址导航
|
在线亚洲一区
|
中文天堂网
|
精品一区av
|
午夜精品久久
|
看免费毛片
|
日韩一区二区三区精品
|
国产福利91精品一区二区三区
|
99精品久久久久久
|
日日夜夜精品免费
|
久久亚洲精品视频
|
国产91清纯白嫩初高中在线观看
|
三级黄色
|
日韩精品一二三
|
91免费在线看
|
久久久综合网
|
黄色国产
|
天天插天天
|
www.午夜
|
天天插天天操
|
激情五月综合色婷婷一区二区
|
日本中文字幕在线
|
五月天综合网
|
国产在线视频一区
|
日韩精品一级
|
国产欧美一区二区三区在线看蜜臀
|
免费黄色av
|
免费成人小视频
|