⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 btc_fft_demo.c

📁 基于visual dsp++开发环境
💻 C
字号:
//--------------------------------------------------------------------------//
//																			//
//	 Name: 	FFT BTC demo for the ADSP-BF537 EZ-KIT							//
//																			//
//--------------------------------------------------------------------------//
//																			//
//	(C) Copyright 2005 - Analog Devices, Inc.  All rights reserved.			//
//																			//
//	Project Name:	FFT Demo												//
//																			//
//	Software:		VisualDSP++ 4.0											//
//																			//
//	Hardware:		ADSP-BF537 EZ-KIT Board									//
//																			//
//--------------------------------------------------------------------------//

#include <sys/exception.h>
#include <filter.h>
#include <math.h>
#include <math_const.h>

#include <btc.h>

#define NUMPOINTS 512

complex_fract16 t[NUMPOINTS];	//temp working
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 = 0;
	int scale_method = 0;
	float freq;

	btc_init();
		
	// install our interrupt handlers
   	register_handler(ik_timer, timerISR);

	//init twiddle factors
	twidfft_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, t, out, w, wst, n, block_exponent, scale_method);

		for (i=0; i<NUMPOINTS; i++) {
			mag[i] = sqrt(out[i].re*out[i].re+out[i].im*out[i].im);
		}
			
		//write to BTC channel
		btc_write_array(0, (unsigned int*)input_arr, sizeof(input_arr));
		btc_write_array(1, (unsigned int*)mag, sizeof(mag));
		
		
		freq += BTC_CHAN2;
		if (freq > MAXFREQ) freq = MINFREQ;
		
	}
}

void create_samples(float f)
{
	int i,j;

	float fs = 48000.0;
	float step;

	//generate input
	for (i=0; i<NUMPOINTS; i++) {
		step = (float)i/fs;
		input_arr[i] = (fract16) (sin(2*PI*f*step)*32760.0);
	}
}

//////////////////////
// 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
}

////////////////////////////
// timer interrupt handler
////////////////////////////
EX_INTERRUPT_HANDLER(timerISR)
{
	btc_poll();
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -