📄 btc_fft_demo.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 + -