简易频谱分析仪


简易频谱分析仪[2005年电子大赛二等奖]

文章来源:凌阳科技教育推广中心
作者:国防科技大学 李楠 刘亮 李俊 发布时间:2006-8-29 12:14:43

摘要:本设计以凌阳16位单片机SPCE061A为核心控制器件,配合Xilinx Virtex-II FPGA及Xilinx公司提供的硬件DSP高级设计工具System Generator,制作完成本数字式外差频谱分析仪。前端利用高性能A/D对被测信号进行采集,利用FPGA高速、并行的处理特点,在FPGA内部完成 数字混频,数字滤波等DSP算法。
SPCE061A单片机是整个设计的核心控制器件,根据从键盘接受的数据控制整个系统的工作流程,包括控制FPGA工作以及控制双路D/A在模拟示波器屏幕上描绘频谱图。人机接口使用128×64液晶和4×4键盘。本系统运行稳定,功能齐全,人机界面友好。
关键字:SPCE061A   简易频谱分析仪

一、方案论证
  频谱分析仪是在频域上观察电信号特征,并在显示仪器上显示当前信号频谱图的仪器。从实现方式上可分为模拟式与数字式两类方案,下面对两种方案进行比较:
  方案一 :模拟式频谱分析仪
  模拟方式的频谱仪以模拟滤波器为基础,通常有并行滤波法、顺序滤波法,可调滤波法、扫描外差法等实现方法,现在广泛应用的模拟频谱分析仪设计方案多为扫描外差法,此方案原理框图如图1.1:


图 1.1 模拟外差式频谱仪原理框图

  图中的扫频振荡器是仪器内部的振荡源,当扫频振荡器的频率 在一定范围内扫动时,输入信号中的各个频率分量 在混频器中产生差频信号( ),依次落入窄带滤波器的通带内(这个通带是固定的),获得中频增益,经检波后加到Y放大器,使亮点在屏幕上的垂直偏移正比于该频率分量的幅值。由于扫描 电压在调制振荡器的同时,又驱动X放大器,从而可以在屏幕上显示出被测信号的线状频谱图。这是目前常用模拟外差式频谱仪的基本原理。模拟外差式频谱仪具有 高带宽和高频率分辨率等优点,但是模拟器件调试复杂,短期实现有难度,尤其是在对频谱信息的存储和分析上,逊色于新兴的数字化频谱仪方案。
  方案二:数字式频谱分析仪
  数字式频谱仪通常使用高速A/D采集当前信号,然后送入处理器处理,最后将得到的各频率分量幅度值数据送入显示器显示,其组成框图如图1.2:

  
图 1.2 数字式频谱仪组成框图

  按照对信号处理方式的不同,数字式频谱仪可分为以下三种:
  (1)基于FFT技术的数字频谱仪:
  这种频谱仪利用快速傅里 叶变换可以将被测信号分解成分立的频率分量,达到与传统频谱分析仪同样的结果。这种新型的频谱分析仪采用数字方法直接由模拟/数字转换器(ADC)对输入 信号取样,再经FFT处理后获得频谱分布图。FFT技术的数字式频谱分析仪在速度上明显超过传统的模拟式频谱分析仪,能够进行实时分析。但由于FFT所取 的是有限长度,运算的点数也是有限的,因此,实现高扫频宽度和高频率分辨率需要高速A/D转换器和高速数字器件的配合。
  (2)基于数字滤波法的数字式频谱仪
   这种频谱仪原理上等同于模拟频谱仪中的并行滤波法或可调滤波法,通过设置多个窄带带通数字滤波器,或是中心频率可变的带通数字滤波器,提取信号经过数字 滤波器的幅度值,实现测量信号频谱的目的,该方法受到数字器件资源的限制,无法设置足够多的数字滤波器,从而无法实现高频率分辨率和高扫频宽度。
  (3)基于外差原理的数字式频谱仪
  "数字式外差"原理是

  • 0
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Main: #include "led.h" #include "delay.h" #include "key.h" #include "sys.h" #include "lcd.h" #include "usart.h" #include "adc.h" #include "stm32_dsp.h" #include /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ #define DOUBLE_COLOR 1 //ÊÇ·ñΪ˫ɫÆÁ£¬ÈôΪ˫ɫÆÁÔò¸ÄΪ1 #define NPT 64 //FFT²ÉÑùµãÊý #define GREEN_STOP_TIME 15 //ÂÌÉ«µã¶¥¶ËÍ£¶Ùʱ¼ä£¬ÖµÔ½´óʱ¼äÔ½³¤ #define GREEN_SUB_SPEED 100 //ÂÌÉ«µãÏÂÒÆËٶȣ¬ÖµÔ½´óËÙ¶ÈÔ½Âý #define RED_SUB_SPEED 50 //ºìɫƵÖùÏòÏÂËõ¶ÌËٶȣ¬ÖµÔ½´óËÙ¶ÈÔ½Âý uint32_t ADC_DataNum=0; //ADC²ÉÑùµãÊý uint32_t RedTime=0; //ºìÉ«µãÏÂÒÆʱ¼ä±äÁ¿ #if DOUBLE_COLOR uint32_t GreenTime=0; //ÂÌÉ«µãÏÂÒÆʱ¼ä±äÁ¿ uint32_t GreenStopTime[32]={0}; //ÂÌÉ«µã¶¥¶ËÍ£¶Ùʱ¼äÊý¾Ý #endif volatile uint8_t ADC_TimeOutFlag=1; //ADC¶¨Ê±²ÉÑùʱ¼äµ½±êÖ¾ extern __IO uint16_t ADCConvertedValue; //ADC²ÉÑùÖµ extern int LCD_COLOR; long lBUFMAG[NPT+NPT/2]; //´æ´¢ÇóÄ£ºóµÄÊý¾Ý long lBUFOUT[NPT];//FFTÊä³öÐòÁÐ long lBUFIN[NPT];//FFTÊäÈëϵÁÐ uint8_t fftHightRedBuf[NPT/2]={0}; //ºìɫƵÖù¸ß¶ÈÊý×é uint8_t DisplayRedDataBuf[32*8]={0}; //ºìÉ«ÏÔʾ»º³åÇø #if DOUBLE_COLOR uint8_t fftHightGreenBuf[NPT/2]={0}; //ÂÌɫƵµã¸ß¶ÈÊý×é uint8_t DisplayGreenDataBuf[32*8]={0}; //ÂÌÉ«ÏÔʾ»º³åÇø #endif u16 color_tab[16]={DARKBLUE,BLUE,LIGHTBLUE,GREEN,LIGHTGREEN,RED,BRED,BRRED,BLACK,YELLOW,CYAN,MAGENTA,GRAYBLUE,LGRAYBLUE,BROWN,LGRAY}; void music_fft_main(uint8_t *RedNewHeight,uint8_t *GreenNewHeight) { int BarWidth = 8; int i=0; int j=0; static uint8_t RedOldHeight[32] = {0}; static uint8_t GreenOldHeight[32] = {0}; for(i=0;iRedOldHeight[i]){//Èç¹ûµ±Ç°µÄÂÌÉ«Öù×Ӹ߶ȱÈ֮ǰµÄ´óÔò²¹ÆëÂÌÉ«Öù×Ó LCD_Fill(RedOldHeight[i],(BarWidth+2)*i,RedNewHeight[i],(BarWidth+2)*i+BarWidth,color_tab[j]); }else{//Èç¹ûµ±Ç°ÏÔʾµÄÂÌÉ«Öù×Ӹ߶ÈСÓÚ֮ǰµÄÖù×ÓÔòÐèÒª½«¶àÓàµÄÂÌÉ«Öù×ÓÓñ³¾°É«Ìî³ä LCD_Fill(RedNewHeight[i],(BarWidth+2)*i,RedOldHeight[i],(BarWidth+2)*i+BarWidth,WHITE); } //½«ÐÂÊý¾Ý±£´æ RedOldHeight[i] = RedNewHeight[i]; GreenOldHeight[i] = GreenNewHeight[i]; if(j>=15) j=0; j++; } } void powerMag(long nfill) { int32_t lX,lY; uint32_t i; for (i=0; i < nfill; i++) { lX= (lBUFOUT[i]<>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; // ÏÈƽ·½ºÍ,ÔÙ¿ª·½ lBUFMAG[i] = (long)(Mag*65536); } } } int main(void) {uint32_t i=0; delay_init(); //ÑÓʱº¯Êý³õʼ»¯ NVIC_Configuration(); //ÉèÖÃNVICÖжϷÖ×é2:2λÇÀÕ¼ÓÅÏȼ¶£¬2λÏìÓ¦ÓÅÏȼ¶ uart_init(9600); //´®¿Ú³õʼ»¯Îª9600 LED_Init(); //LED¶Ë¿Ú³õʼ»¯ TIM2_Configuration(); TIM2_NVIC_Configuration(); FFT_RCC_Configuration(); FFT_GPIO_Configuration(); FFT_DMA_Init(); FFT_ADC_Init(); LCD_Init(); // BACK_COLOR=BLACK; TIM_Cmd(TIM2, ENABLE); ADC_SoftwareStartConvCmd(ADC1, DISABLE); while(1) { if(ADC_TimeOutFlag){ #if DOUBLE_COLOR GreenTime++; #endif RedTime++; ADC_TimeOutFlag=0; if(ADC_DataNumCR2 |= 0x00500000;// ADC_SoftwareStartConvCmd(ADC1, ENABLE); while(!DMA_GetFlagStatus(DMA1_FLAG_TC1)); /* Clear channel1 transfer complete flag */ DMA_ClearFlag(DMA1_FLAG_TC1); // ADC1->CR2 &= 0xFFAFFFFF;// ADC_SoftwareStartConvCmd(ADC1, DISABLE); lBUFIN[ADC_DataNum]=ADCConvertedValue<<16; ADC_DataNum++; }else{ TIM_Cmd(TIM2, DISABLE); ADC_DataNum=0; cr4_fft_64_stm32(lBUFOUT,lBUFIN,NPT);//µ÷ÓÃSTM32µÄDSP¿â×÷FFT±ä»» powerMag(NPT);//¼ÆËãƵµã·ùÖµ //¸üкìÉ«µãµÄ¸ß¶È for(i=0;ifftHightRedBuf[i]){ fftHightRedBuf[i]=(lBUFMAG[i]); } #if DOUBLE_COLOR //Ë¢ÐÂÂÌÉ«µã¸ß¶È if(fftHightRedBuf[i]>=fftHightGreenBuf[i]){ fftHightGreenBuf[i]=fftHightRedBuf[i]; GreenStopTime[i]=GREEN_STOP_TIME;//Â̵ãÍ£¶Ùʱ¼ä if(fftHightRedBuf[i]>=235){ fftHightGreenBuf[i]=235; fftHightRedBuf[i]=235; } } #else if(fftHightRedBuf[i]>=239){ fftHightRedBuf[i]=239; } #endif } //ÏÔʾºìÉ«Öù×Ó music_fft_main(fftHightRedBuf,fftHightGreenBuf); //ÏÔʾÂÌÉ«µã #if DOUBLE_COLOR //ÂÌÉ«µãÏÂÒÆ if((GreenTime>GREEN_SUB_SPEED)){ //ÂÌÉ«µãϽµ¼ä¸ôʱ¼ä GreenTime=0; for(i=0;iRED_SUB_SPEED){ RedTime=0; for(i=0;i<NPT/2;i++){ if((fftHightRedBuf[i]!=0)){ fftHightRedBuf[i]--; } } } //ÂÌÉ«µãÍ£¶Ùʱ¼ä¼õÒ» #if DOUBLE_COLOR for(i=0;iSR = (uint16_t)~TIM_FLAG_Update; TIM_ClearITPendingBit(TIM2,TIM_FLAG_Update); //ÇåÖÐ¶Ï ADC_TimeOutFlag=1; } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值