6713 User Manual
6713 User Manual
6713 User Manual
USER MANUAL
CONTENTS
DSK FEATURES
INSTALLATION PROCEDURE
INTRODUCTON TO CODE COMPOSER STUDIO
PROCEDURE TO WORK ON CCS
EXPERIMENTS USING DSK
2. IMPULSE RESPONSE
TMS320C6713 DSK
Package Contents
The C6713™ DSK builds on TI's industry-leading line of low cost, easy-to-use DSP
Starter Kit (DSK) development boards. The high-performance board features the
TMS320C6713 floating-point DSP. Capable of performing 1350 million floating-point
operations per second (MFLOPS), the C6713 DSP makes the C6713 DSK the most
powerful DSK development board.
The DSK is USB port interfaced platform that allows to efficiently develop and test
applications for the C6713. The DSK consists of a C6713-based printed circuit board that
will serve as a hardware reference design for TI’s customers’ products. With extensive
host PC and target DSP software support, including bundled TI tools, the DSK provides
ease-of-use and capabilities that are attractive to DSP engineers.
The following checklist details items that are shipped with the C6711 DSK kit.
The C6713 DSK has a TMS320C6713 DSP onboard that allows full-speed verification of
code with Code Composer Studio. The C6713 DSK provides:
• A USB Interface
• SDRAM and ROM
• An analog interface circuit for Data conversion (AIC)
• An I/O port
• Embedded JTAG emulation support
Connectors on the C6713 DSK provide DSP external memory interface (EMIF) and
peripheral signals that enable its functionality to be expanded with custom or third party
daughter boards.
The DSK provides a C6713 hardware reference design that can assist you in the
development of your own C6713-based products. In addition to providing a reference for
interfacing the DSP to various types of memories and peripherals, the design also
addresses power, clock, JTAG, and parallel peripheral interfaces.
The C6713 DSK includes a stereo codec. This analog interface circuit (AIC) has the
following characteristics:
The 6713 DSK is a low-cost standalone development platform that enables customers to
evaluate and develop applications for the TI C67XX DSP family. The DSK also serves as
a hardware reference design for the TMS320C6713 DSP. Schematics, logic equations
and application notes are available to ease hardware development and reduce time to
market.
The DSK uses the 32-bit EMIF for the SDRAM (CE0) and daughtercard expansion
interface (CE2 and CE3). The Flash is attached to CE1 of the EMIF in 8-bit mode.
An on-board AIC23 codec allows the DSP to transmit and receive analog signals.
McBSP0 is used for the codec control interface and McBSP1 is used for data. Analog
audio I/O is done through four 3.5mm audio jacks that correspond to microphone input,
line input, line output and headphone output. The codec can select the microphone or the
line input as the active input. The analog output is driven to both the line out (fixed gain)
and headphone (adjustable gain) connectors. McBSP1 can be re-routed to the
expansion connectors in software.
A programmable logic device called a CPLD is used to implement glue logic that ties the
board components together. The CPLD has a register based user interface that lets the
user configure the board by reading and writing to the CPLD registers. The registers
reside at the midpoint of CE1.
The DSK includes 4 LEDs and 4 DIP switches as a simple way to provide the user with
interactive feedback. Both are accessed by reading and writing to the CPLD registers.
An included 5V external power supply is used to power the board. On-board voltage
regulators provide the 1.26V DSP core voltage, 3.3V digital and 3.3V analog voltages. A
voltage supervisor monitors the internally generated voltage, and will hold the board in
reset until the supplies are within operating specifications and the reset button is
released. If desired, JP1 and JP2 can be used as power test points for the core and I/O
power supplies.
Code Composer communicates with the DSK through an embedded JTAG emulator with
a USB host interface. The DSK can also be used with an external emulator through the
external JTAG connector.
INSTALLATION
SYSTEM REQUIREMENTS
Minimum Recommended
• 233MHz or Higher Pentium- • 500MHz or Higher Pentium –
Compatible CPU Compatible CPU
• 600MB of free hard disk space
• 128MB of RAM • 128MB RAM
• SVGA (800 x 600 ) display
• Internet Explorer (4.0 or later) or • 16bit Color
• Netscape Navigator (4.7 or later)
• Local CD-ROM drive
If Code Composer Studio IDE fails to configure your port correctly, perform the following
steps:
• Test the USB port by running DSK Port test from the start menu
SOFTWARE INSTALLATION
You must install the hardware before you install the software on your system.
Code Composer is the DSP industry's first fully integrated development environment
(IDE) with DSP-specific functionality. With a familiar environment liked MS-based C++TM,
Code Composer lets you edit, build, debug, profile and manage projects from a single
unified environment. Other unique features include graphical signal analysis,
injection/extraction of data signals via file I/O, multi-processor debugging, automated
testing and customization via a C-interpretive scripting language and much more.
• IDE
• Debug IDE
• Advanced watch windows
• Integrated editor
• File I/O, Probe Points, and graphical algorithm scope probes
• Advanced graphical signal analysis
• Interactive profiling
• Automated testing and customization via scripting
• Visual project management system
• Compile in the background while editing and debugging
• Multi-processor debugging
• Help on the target DSP
Note :
Type the code (Save & give a name to file, Eg: sum.c).
5. To Compile:
Project Compile File
6. To build or Link:
Project build,
Which will create the final executable (.out) file.(Eg. sum.out).
8. To execute project:
Debug Run.
sum.c
#include<stdio.h>
main()
{
int i=30,j=40,k;
k=i+j;
printf("%d",k);
}
1. Keep the cursor on the on to the line from where u want to start single step
debugging.(eg: set a break point on to first line int i=0; of your project.)
4. Debug Run.
6. Now press F10. See the changes happening in the watch window.
7. Similarly go to view & select CPU registers to view the changes happening in CPU
registers.
8. Repeat steps 2 to 6.
DIFFERENCE EQUATION
An Nth order linear constant – coefficient difference equation can be represented as
N M
ak y(n-k) = br x(n-r)
k=0 r=0
If we assume that the system is causal a linear difference equation provides an explicit
relationship between the input and output..this can be seen by rewriting above equation.
M N
y(n) = br/a0 x(n-r) -- ak/a0 y y(n-k)
r=0 k=1
#include <stdio.h>
#include<math.h>
float y[3]={0,0,0};
float x[3]={0,0,0};
float z[128],m[128],n[128],p[128];
main()
{
int i=0,j;
float a[3]={ 0.072231,0.144462,0.072231};
float b[3]={ 1.000000,-1.109229,0.398152};
for(i=0;i<128;i++)
{
m[i]=sin(2*3.14*FREQ*i/24000);
}
for(j=0;j<128;j++)
{
x[0]=m[j];
y[0] = (a[0] *x[0]) +(a[1]* x[1] ) +(x[2]*a[2]) - (y[1]*b[1])-
(y[2]*b[2]);
z[j]=y[0];
y[2]=y[1];
y[1]=y[0];
x[2]=x[1];
x[1] = x[0];
}
}
PROCEDURE:
Open Code Composer Studio, make sure the DSP kit is turned on.
Note: To verify the Diffence Equation , Observe the output for high
frequency and low frequency by changing variable “FREQ”
in the program.
IMPULSE RESPONSE
‘C’ Program to Implement Impulse response:
#include <stdio.h>
#define Order 2
#define Len 10
float y[Len]={0,0,0},sum;
main()
{
int j,k;
for(j=0;j<Len;j++)
{
sum=0;
for(k=1;k<=Order;k++)
{
if((j-k)>=0)
sum=sum+(b[k]*y[j-k]);
}
if(j<=Order)
{
y[j]=a[j]-sum;
}
else
{
y[j]=-sum;
}
printf("Respose[%d] = %f\n",j,y[j]);
}
}
LINEAR CONVOLUTION
To Verify Linear Convolution:
Linear Convolution Involves the following operations.
1. Folding
2. Multiplication
3. Addition
4. Shifting
r= 0 1 2 3 4 5 6
n= 0 x[0]h[0] x[0]h[1] x[0]h[2] x[0]h[3]
1 x[1]h[0] x[1]h[1] x[1]h[2] x[1]h[3]
2 x[2]h[0] x[2]h[1] x[2]h[2] x[2]h[3]
3 x[3]h[0] x[3]h[1] x[3]h[2] x[3]h[3]
NOTE: At the end of input sequences pad ‘n’ and ‘k’ no. of zero’s
int y[LENGHT1+LENGHT2-1];
main()
{
int i=0,j;
for(i=0;i<(LENGHT1+LENGHT2-1);i++)
{
y[i]=0;
for(j=0;j<=i;j++)
y[i]+=x[j]*h[i-j];
}
for(i=0;i<(LENGHT1+LENGHT2-1);i++)
printf("%d\n",y[i]);
PROCEDURE:
Open Code Composer Studio, make sure the DSP kit is turned on.
conv.asm:
.global _main
X .half 1,2,3,4,0,0,0,0 ;input1, M=4
H .half 1,2,3,4,0,0,0,0 ;input2, N=4
.bss Y,14,2 ;OUTPUT, R=M+N-1
;At the end of input sequences pad ‘M’ and ‘N’ no. of zero’s
_main:
MVKL .S1 X,A4
MVKH .S1 X,A4 ;POINTER TO X
MVKL .S2 H,B4
MVKH .S2 H,B4 ;POINTER TO H
MVKL .S1 Y,A5
MVKH .S1 Y,A5 ;POINTER TO Y
B B3
NOP 5
Circular Convolution
Steps for Cyclic Convolution
Steps for cyclic convolution are the same as the usual convolution, except all index
calculations are done "mod N" = "on the wheel"
Steps for Cyclic Convolution
Step 2: "Spin" h[−m] n times Anti Clock Wise (counter-clockwise) to get h[n-m]
(i.e. Simply rotate the sequence, h[n], clockwise by n steps)
Figure 2: Step 2
Step 3: Pointwise multiply the f[m] wheel and the h[n−m] wheel. sum=y[n]
Example 1: Convolve (n = 4)
• h[−m] =
Figure 4
Multiply f[m] and sum to yield: y[0] =3
• h[1−m]
Figure 5
Multiply f[m] and sum to yield: y[1] =5
• h[2−m]
Figure 6
Multiply f[m] and sum to yield: y[2] =3
• h[3−m]
Figure 7
Multiply f[m] and sum to yield: y[3] =1
}
IN PUT:
Eg: x[4]={3, 2, 1,0}
h[4]={1, 1, 0,0}
PROCEDURE:
Open Code Composer Studio, make sure the DSP kit is turned on.
2.0 Prerequisites
TMS320C6713 DSP Starter Kit, PC with Code Composer Studio, CRO, Audio Source,
Speakers and Signal Generator.
4.0 Procedure
• All the Real time implementations covered in the Implementations module follow
code Configuration using board support library.
• The board Support Library (CSL) is a collection of functions, macros, and symbols
used to configure and control on-chip peripherals.
• The goal is peripheral ease of use, shortened development time, portability,
hardware abstraction, and some level of standardization and compatibility among
TI devices.
• BSL is a fully scalable component of DSP/BIOS. It does not require the use of
other DSP/BIOS components to operate.
3. Switch on the Signal Generator with a sine wave of frequency 500 Hz. and Vp-p=1.5v
4. Now Switch on the DSK and Bring Up Code Composer Studio on the PC.
8. Add the given “codec.c” file to the current project which has the main function and
calls all the other necessary routines.
Path “C:\CCStudio\C6000\dsk6713\lib\dsk6713bsl.lib”
12. You can notice the input signal of 500 Hz. appearing on the CRO verifying the codec
configuration.
13. You can also pass an audio input and hear the output signal through the speakers.
14. You can also vary the sampling frequency using the DSK6713_AIC23_setFreq
Function in the “codec.c” file and repeat the above steps.
5.0 Conclusion:
The codec TLV320AIC23 successfully configured using the board support library
and verified.
codec.c
#include "xyzcfg.h"
#include "dsk6713.h"
#include "dsk6713_aic23.h"
void main()
{
DSK6713_AIC23_CodecHandle hCodec;
int l_input, r_input,l_output, r_output;
while(1)
{
/* Read a sample to the left channel */
while (!DSK6713_AIC23_read(hCodec, &l_input));
Following are the steps to design linear phase FIR filters Using Windowing Method.
III. Compute the desired Impulse Response h d (n) using particular Window
Eg: b_rect1=fir1(order, Wc , 'high',boxcar(31));
IV. Convolve input sequence with truncated Impulse Response x (n)*h (n)
The cut-off frequency Wn must be between 0 < Wn < 1.0, with 1.0
corresponding to half the sample rate. The filter B is real and
has linear phase, i.e., even symmetric coefficients obeying B(k) =
B(N+2-k), k = 1,2,...,N+1.
If Wn is a multi-element vector,
Wn = [W1 W2 W3 W4 W5 ... WN],
FIR1 returns an order N multiband filter with bands
0 < W < W1, W1 < W < W2, ..., WN < W < 1.
B = FIR1(N,Wn,'DC-1') makes the first band a passband.
B = FIR1(N,Wn,'DC-0') makes the first band a stopband.
By default, the filter is scaled so the center of the first pass band
has magnitude exactly one after windowing. Use a trailing 'noscale'
argument to prevent this scaling, e.g. B = FIR1(N,Wn,'noscale'),
B = FIR1(N,Wn,'high','noscale'), B = FIR1(N,Wn,wind,'noscale').
% FIR Low pass filters using rectangular, triangular and kaiser windows
order = 30;
cf=[500/4000,1000/4000,1500/4000]; cf--> contains set of cut-off frequencies[W c ]
fid=fopen('FIR_lowpass_rectangular.txt','wt');
fprintf(fid,'\t\t\t\t\t\t%s\n','Cutoff -400Hz');
fprintf(fid,'\nfloat b_rect1[31]={');
fprintf(fid,'%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,\n',b_rect1);
fseek(fid,-1,0);
fprintf(fid,'};');
fprintf(fid,'\n\n\n\n');
fprintf(fid,'\t\t\t\t\t\t%s\n','Cutoff -800Hz');
fprintf(fid,'\nfloat b_rect2[31]={');
fprintf(fid,'%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,\n',b_rect2);
fseek(fid,-1,0);
fprintf(fid,'};');
fprintf(fid,'\n\n\n\n');
fprintf(fid,'\t\t\t\t\t\t%s\n','Cutoff -1200Hz');
fprintf(fid,'\nfloat b_rect3[31]={');
fprintf(fid,'%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,\n',b_rect3);
fseek(fid,-1,0);
fprintf(fid,'};');
fclose(fid);
winopen('FIR_highpass_rectangular.txt');
T.1 : Matlab generated Coefficients for FIR Low Pass Kaiser filter:
Cutoff -500Hz
float b_kai1[31]={-0.000019,-0.000170,-0.000609,-0.001451,-0.002593,-0.003511,-
0.003150,0.000000,0.007551,0.020655,0.039383,0.062306,0.086494,0.108031,0.122944,
0.128279,0.122944,0.108031,0.086494,0.062306,0.039383,0.020655,0.007551,0.000000,
-0.003150,-0.003511,-0.002593,-0.001451,-0.000609,-0.000170,-0.000019};
Cutoff -1000Hz
float b_kai2[31]={-0.000035,-0.000234,-0.000454,0.000000,0.001933,0.004838,0.005671,
-0.000000,-0.013596,-0.028462,-0.029370,0.000000,0.064504,0.148863,0.221349,0.249983,
IMPLEMENTATION OF AN FIR FILTER :
0.221349,0.148863,0.064504,0.000000,-0.029370,-0.028462,-0.013596,-0.000000,0.005671,
0.004838,0.001933,0.000000,-0.000454,-0.000234, -0.000035};
ALGORITHM TO IMPLEMENT :
Cutoff -1500Hz
We need to realize an advance FIR filter by implementing its difference equation as per
float b_kai3[31]={-0.000046,-0.000166,0.000246,0.001414,0.001046,-0.003421,-0.007410,
the specifications. A direct form I implementation approach is taken. (The filter coefficients
0.000000,0.017764,0.020126,-0.015895,-0.060710,-0.034909,0.105263,0.289209,0.374978,
are taken as ai as generated by the Matlab program.)
0.289209,0.105263,-0.034909,-0.060710,-0.015895,0.020126,0.017764,0.000000,-0.007410,
-0.003421,0.001046,0.001414,0.000246,-0.000166, -0.000046};
•
•
Cutoff -500Hz
float b_rect1[31]={-0.008982,-0.017782,-0.025020,-0.029339,-0.029569,-0.024895,
-0.014970,0.000000,0.019247,0.041491,0.065053,0.088016,0.108421,0.124473,0.134729,
0.138255,0.134729,0.124473,0.108421,0.088016,0.065053,0.041491,0.019247,0.000000,
-0.014970,-0.024895,-0.029569,-0.029339,-0.025020,-0.017782,-0.008982};
Cutoff -1000Hz
float b_rect2[31]={-0.015752,-0.023869,-0.018176,0.000000,0.021481,0.033416,0.026254,-
0.000000,-0.033755,-0.055693,-0.047257,0.000000,0.078762,0.167080,0.236286,0.262448,
0.236286,0.167080,0.078762,0.000000,-0.047257,-0.055693,-0.033755,-0.000000,0.026254,
0.033416,0.021481,0.000000,-0.018176,-0.023869,-0.015752};
Cutoff -1500Hz
float b_rect2[31]={-0.020203,-0.016567,0.009656,0.027335,0.011411,-0.023194,-0.033672,
0.000000,0.043293,0.038657,-0.025105,-0.082004,-0.041842,0.115971,0.303048,0.386435,
0.303048,0.115971,-0.041842,-0.082004,-0.025105,0.038657,0.043293,0.000000,-0.033672,
-0.023194,0.011411,0.027335,0.009656,-0.016567,-0.020203};
FLOWCHART FOR FIR :
T.3 : Matlab generated Coefficients for FIR Low Pass Triangular filter
Cutoff -500Hz
float b_tri1[31]={0.000000,-0.001185,-0.003336,-0.005868,-0.007885,-0.008298,-0.005988,
0.000000,0.010265,0.024895,0.043368,0.064545,0.086737,0.107877,0.125747,0.138255,
0.125747,0.107877,0.086737,0.064545,0.043368,0.024895,0.010265,0.000000,-0.005988,
-0.008298,-0.007885,-0.005868,-0.003336,-0.001185,0.000000};
Cutoff -1000Hz
float b_tri2[31]={0.000000,-0.001591,-0.002423,0.000000,0.005728,0.011139,0.010502,
-0.000000,-0.018003,-0.033416,-0.031505,0.000000,0.063010,0.144802,0.220534,0.262448,
0.220534,0.144802,0.063010,0.000000,-0.031505,-0.033416,-0.018003,-0.000000,0.010502,
0.011139,0.005728,0.000000,-0.002423,-0.001591,0.000000};
Cutoff -1500Hz
float b_tri3[31]={0.000000,-0.001104,0.001287,0.005467,0.003043,-0.007731,-0.013469,
0.000000,0.023089,0.023194,-0.016737,-0.060136,-0.033474,0.100508,0.282844,0.386435,
0.282844,0.100508,-0.033474,-0.060136,-0.016737,0.023194,0.023089,0.000000,-0.013469,
-0.007731,0.003043,0.005467,0.001287,-0.001104,0.000000};
% FIR High pass filters using rectangular, triangular and kaiser windows
fid=fopen('FIR_highpass_rectangular.txt','wt');
fprintf(fid,'\t\t\t\t\t\t%s\n','Cutoff -400Hz');
fprintf(fid,'\nfloat b_rect1[31]={');
fprintf(fid,'%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,\n',b_rect1);
fseek(fid,-1,0);
fprintf(fid,'};');
fprintf(fid,'\n\n\n\n');
fprintf(fid,'\t\t\t\t\t\t%s\n','Cutoff -800Hz');
fprintf(fid,'\nfloat b_rect2[31]={');
fprintf(fid,'%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,\n',b_rect2);
fseek(fid,-1,0);
fprintf(fid,'};');
fprintf(fid,'\n\n\n\n');
fprintf(fid,'\t\t\t\t\t\t%s\n','Cutoff -1200Hz');
fprintf(fid,'\nfloat b_rect3[31]={');
fprintf(fid,'%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,\n',b_rect3);
fseek(fid,-1,0);
fprintf(fid,'};');
fclose(fid);
winopen('FIR_highpass_rectangular.txt');
Cutoff -400Hz
float b_kai1[31]={0.000050,0.000223,0.000520,0.000831,0.000845,-0.000000,-0.002478,
-0.007437,-0.015556,-0.027071,-0.041538,-0.057742,-0.073805,-0.087505,-0.096739,
0.899998,-0.096739,-0.087505,-0.073805,-0.057742,-0.041538,-0.027071,-0.015556,
-0.007437,-0.002478,-0.000000,0.000845,0.000831,0.000520,0.000223,0.000050};
Cutoff -800Hz
float b_kai2[31]={0.000000,-0.000138,-0.000611,-0.001345,-0.001607,-0.000000,0.004714,
0.012033,0.018287,0.016731,0.000000,-0.035687,-0.086763,-0.141588,-0.184011,0.800005,
IMPLEMENTATION OF AN FIR FILTER :
-0.184011,-0.141588,-0.086763,-0.035687,0.000000,0.016731,0.018287,0.012033,0.004714,
-0.000000,-0.001607,-0.001345,-0.000611,-0.000138,0.000000};
ALGORITHM TO IMPLEMENT :
Cutoff -1200Hz
We need to realize an advance FIR filter by implementing its difference equation as per
float b_kai3[31]={-0.000050,-0.000138,0.000198,0.001345,0.002212,-0.000000,-0.006489,
the specifications. A direct form I implementation approach is taken. (The filter coefficients
-0.012033,-0.005942,0.016731,0.041539,0.035687,-0.028191,-0.141589,-0.253270,0.700008,
are taken as ai as generated by the Matlab program.)
-0.253270,-0.141589,-0.028191,0.035687,0.041539,0.016731,-0.005942,-0.012033,-0.006489,
-0.000000,0.002212,0.001345,0.000198,-0.000138,-0.000050};
•
•
Cutoff -400Hz
float b_rect1[31]={0.021665,0.022076,0.020224,0.015918,0.009129,-0.000000,-0.011158,
-0.023877,-0.037558,-0.051511,-0.064994,-0.077266,-0.087636,-0.095507,-.100422,0.918834,
-0.100422,-0.095507,-0.087636,-0.077266,-0.064994,-0.051511,-0.037558,-0.023877,
-0.011158,-0.000000,0.009129,0.015918,0.020224,0.022076,0.021665};
Cutoff -800Hz
float b_rect2[31]={0.000000,-0.013457,-0.023448,-0.025402,-0.017127,-0.000000,0.020933,
0.038103,0.043547,0.031399,0.000000,-0.047098,-0.101609,-0.152414,-0.188394,0.805541,
-0.188394,-0.152414,-0.101609,-0.047098,0.000000,0.031399,0.043547,0.038103,0.020933,
-0.000000,-0.017127,-0.025402,-0.023448,-0.013457,0.000000};
Cutoff -1200Hz
float b_rect3[31]={-0.020798,-0.013098,0.007416,0.024725,0.022944,-0.000000,-0.028043,
-0.037087,-0.013772,0.030562,0.062393,0.045842,-0.032134,-0.148349,-0.252386,0.686050,
-0.252386,-0.148349,-0.032134,0.045842,0.062393,0.030562,-0.013772,-0.037087,-0.028043,
-0.000000,0.022944,0.024725,0.007416,-0.013098,-0.020798};
Cutoff -800Hz
float b_tri2[31]={0.000000,-0.000897,-0.003126,-0.005080,-0.004567,-0.000000,0.008373,
0.017782,0.023225,0.018839,0.000000,-0.034539,-0.081287,-0.132092,-0.175834,0.805541,
-0.175834,-0.132092,-0.081287,-0.034539,0.000000,0.018839,0.023225,0.017782,0.008373,
-0.000000,-0.004567,-0.005080,-0.003126,-0.000897,0.000000};
Cutoff -1200Hz
float b_tri3[31]={0.000000,-0.000901,0.001021,0.005105,0.006317,-0.000000,-0.011581,
-0.017868,-0.007583,0.018931,0.042944,0.034707,-0.026541,-0.132736,-0.243196,0.708287,
-0.243196,-0.132736,-0.026541,0.034707,0.042944,0.018931,-0.007583,-0.017868,-0.011581,
-0.000000,0.006317,0.005105,0.001021,-0.000901,0.000000};
Start
Initialize Counter = 0
Initialize Output = 0 , i = 0
Output += coeff[N-i]*val[i]
Shift the input value by one
No
Is the loop
Cnt = order
fir.c
#include "filtercfg.h"
#include "dsk6713.h"
#include "dsk6713_aic23.h"
DSK6713_AIC23_Config config = {\
0x0017, /* 0 DSK6713_AIC23_LEFTINVOL Leftline input channel volume */\
0x0017, /* 1 DSK6713_AIC23_RIGHTINVOL Right line input channel volume*/\
0x00d8, /* 2 DSK6713_AIC23_LEFTHPVOL Left channel headphone volume */\
0x00d8, /* 3 DSK6713_AIC23_RIGHTHPVOL Right channel headphone volume */\
0x0011, /* 4 DSK6713_AIC23_ANAPATH Analog audio path control */\
0x0000, /* 5 DSK6713_AIC23_DIGPATH Digital audio path control */\
0x0000, /* 6 DSK6713_AIC23_POWERDOWN Power down control */\
0x0043, /* 7 DSK6713_AIC23_DIGIF Digital audio interface format */\
0x0081, /* 8 DSK6713_AIC23_SAMPLERATE Sample rate control */\
0x0001 /* 9 DSK6713_AIC23_DIGACT Digital interface activation */ \
};
/*
* main() - Main code routine, initializes BSL and generates tone
*/
void main()
{
DSK6713_AIC23_CodecHandle hCodec;
DSK6713_AIC23_setFreq(hCodec, 1);
while(1)
{ /* Read a sample to the left channel */
while (!DSK6713_AIC23_read(hCodec, &l_input));
l_output=(Int16)FIR_FILTER(&filter_Coeff ,l_input);
r_output=l_output;
for(i=29;i>0;i--)
in_buffer[i] = in_buffer[i-1]; /* shuffle the buffer */
for(i=0;i<31;i++)
output = output + h[i] * in_buffer[i];
return(output);
PROCEDURE :
Note: “Kindly refer the Topic Configuration of 6713 Codec using BSL”
Add the given above ‘C’ source file to the current project (remove codec.c source
file from the project if you have already added).
Connect the speaker jack to the input of the CRO.
Build the program.
Load the generated object file(*.out) on to Target board.
Run the program
Observe the waveform that appears on the CRO screen.
Vary the frequency on function generator to see the response of filter.
In the design of frequency – selective filters, the desired filter characteristics are specified
in the frequency domain in terms of the desired magnitude and phase response of the
filter. In the filter design process, we determine the coefficients of a causal IIR filter that
closely approximates the desired frequency response specifications.
UNIT OBJECTIVE:
The aim of this laboratory exercise is to design and implement a Digital IIR Filter &
observe its frequency response. In this experiment we design a simple IIR filter so as to
stop or attenuate required band of frequencies components and pass the frequency
components which are outside the required band.
BACKGROUND CONCEPTS:
EQUIPMENTS NEEDED:
ALGORITHM TO IMPLEMENT:
We need to realize the Butter worth band pass IIR filter by implementing the difference
equation y[n] = b0x[n] + b1x[n-1]+b2x[n-2]-a1y[n-1]-a2y[n-2] where b0 – b2, a0-a2 are feed
forward and feedback word coefficients respectively [Assume 2nd order of filter].These
coefficients are calculated using MATLAB.A direct form I implementation approach is
taken.
• Step 1 - Initialize the McBSP, the DSP board and the on board codec.
“Kindly refer the Topic Configuration of 6713Codec using BSL”
• Step 2 - Initialize the discrete time system , that is , specify the initial conditions.
Generally zero initial conditions are assumed.
• Step 3 - Take sampled data from codec while input is fed to DSP kit from the signal
generator. Since Codec is stereo , take average of input data read from left and right
channel . Store sampled data at a memory location.
• Step 4 - Perform filter operation using above said difference equation and store
filter Output at a memory location .
• Step 5 - Output the value to codec (left channel and right channel) and view the
output at Oscilloscope.
• Step 6 - Go to step 3.
Start
Do y[-3] = y[-2],y[-2]=y[-1]
and Y[-1] = output . output = x[0]b0+x[-1]b1+
x[-3] = x[-2], x[-2]=x[-1] x[-2]b2 - y[-1]a1 - y[-2]a2
x[-1]=x[0]
Poll for ready bit
Stop
order = 2;
cf=[2500/12000,8000/12000,1600/12000];
fid=fopen('IIR_LP_BW.txt','wt');
fprintf(fid,'\t\t-----------Pass band range: 0-2500Hz----------\n');
fprintf(fid,'\t\t-----------Magnitude response: Monotonic-----\n\n\');
fprintf(fid,'\n float num_bw1[9]={');
fprintf(fid,'%f,%f,%f,%f,%f,\n%f,%f,%f,%f};\n',num_bw1);
fprintf(fid,'\nfloat den_bw1[9]={');
fprintf(fid,'%f,%f,%f,%f,%f,\n%f,%f,%f,%f};\n',den_bw1);
fclose(fid);
winopen('IIR_LP_BW.txt');
fid=fopen('IIR_LP_CHEB Type1.txt','wt');
fprintf(fid,'\t\t-----------Pass band range: 2500Hz----------\n');
fprintf(fid,'\t\t-----------Magnitude response: Rippled (3dB) -----\n\n\');
fprintf(fid,'\nfloat num_cb1[9]={');
fprintf(fid,'%f,%f,%f,%f,%f,\n%f,%f,%f,%f};\n',num_cb1);
fprintf(fid,'\nfloat den_cb1[9]={');
fprintf(fid,'%f,%f,%f,%f,%f,\n%f,%f,%f,%f};\n',den_cb1);
fprintf(fid,'\n\n\n\t\t-----------Pass band range: 8000Hz----------\n');
fprintf(fid,'\t\t-----------Magnitude response: Rippled (3dB)-----\n\n');
fprintf(fid,'\nfloat num_cb2[9]={');
fprintf(fid,'%f,%f,%f,%f,%f,\n%f,%f,%f,%f};\n',num_cb2);
fprintf(fid,'\nfloat den_cb2[9]={');
fprintf(fid,'%f,%f,%f,%f,%f,\n%f,%f,%f,%f};\n',den_cb2);
fclose(fid);
winopen('IIR_LP_CHEB Type1.txt');
%%%%%%%%%%%%%%%%%%
figure(1);
[h,w]=freqz(num_bw1,den_bw1);
w=(w/max(w))*12000;
plot(w,20*log10(abs(h)),'linewidth',2)
hold on
[h,w]=freqz(num_cb1,den_cb1);
w=(w/max(w))*12000;
plot(w,20*log10(abs(h)),'linewidth',2,'color','r')
grid on
legend('Butterworth','Chebyshev Type-1');
xlabel('Frequency in Hertz');
ylabel('Magnitude in Decibels');
title('Magnitude response of Low pass IIR filters (Fc=2500Hz)');
figure(2);
[h,w]=freqz(num_bw2,den_bw2);
w=(w/max(w))*12000;
plot(w,20*log10(abs(h)),'linewidth',2)
hold on
[h,w]=freqz(num_cb2,den_cb2);
w=(w/max(w))*12000;
plot(w,20*log10(abs(h)),'linewidth',2,'color','r')
grid on
legend('Butterworth','Chebyshev Type-1 (Ripple: 3dB)');
xlabel('Frequency in Hertz');
ylabel('Magnitude in Decibels');
title('Magnitude response in the passband');
axis([0 12000 -20 20]);
15
Note: We have Multiplied Floating Point Values with 32767(2 ) to get Fixed Point Values.
15
Note: We have Multiplied Floating Point Values with 32767(2 ) to get Fixed Point Values.
15
Note: We have Multiplied Floating Point Values with 32767(2 ) to get Fixed Point Values.
15
Note: We have Multiplied Floating Point Values with 32767(2 ) to get Fixed Point Values.
#include "xyzcfg.h"
#include "dsk6713.h"
#include "dsk6713_aic23.h"
/*
* main() - Main code routine, initializes BSL and generates tone
*/
void main()
{
DSK6713_AIC23_CodecHandle hCodec;
DSK6713_AIC23_setFreq(hCodec, 3);
while(1)
{ /* Read a sample to the left channel */
while (!DSK6713_AIC23_read(hCodec, &l_input));
l_output=IIR_FILTER(&filter_Coeff ,l_input);
r_output=l_output;
return (temp<<2);
}
PROCEDURE :
Note: “Kindly refer the Topic Configuration of 6713 Codec using BSL”
Add the given above ‘C’ source file to the current project (remove codec.c source
file from the project if you have already added).
Connect the speaker jack to the input of the CRO.
Build the program.
Load the generated object file(*.out) on to Target board.
Run the program
Observe the waveform that appears on the CRO screen.
Vary the frequency on function generator to see the response of filter
Adaptive Filters
#include "xyzcfg.h"
#include "dsk6713.h"
#include "dsk6713_aic23.h"
#define beta 1E-12 //rate of convergence
#define N 30
short int adaptive_filter(short int ,short int );
float delay[N];
float w[N];
DSK6713_AIC23_Config config = {\
0x0017, /* 0 DSK6713_AIC23_LEFTINVOL Left line input channel volume */ \
0x0017, /* 1 DSK6713_AIC23_RIGHTINVOL Right line input channel volume */\
0x00d8, /* 2 DSK6713_AIC23_LEFTHPVOL Left channel headphone volume */ \
0x00d8, /* 3 DSK6713_AIC23_RIGHTHPVOL Right channel headphone volume */ \
0x0011, /* 4 DSK6713_AIC23_ANAPATH Analog audio path control */ \
0x0000, /* 5 DSK6713_AIC23_DIGPATH Digital audio path control */ \
0x0000, /* 6 DSK6713_AIC23_POWERDOWN Power down control */ \
0x0043, /* 7 DSK6713_AIC23_DIGIF Digital audio interface format */ \
0x0081, /* 8 DSK6713_AIC23_SAMPLERATE Sample rate control */ \
0x0001 /* 9 DSK6713_AIC23_DIGACT Digital interface activation */ \
};
/*
* main() - Main code routine, initializes BSL and generates tone
*/
void main()
{
DSK6713_AIC23_CodecHandle hCodec;
DSK6713_AIC23_setFreq(hCodec, 1);
while(1)
{
while (!DSK6713_AIC23_read(hCodec,&l_input));
l_output=(short int)adaptive_filter(l_input,r_input);
r_output=l_output;
//output=((short)dplusn);//output (desired+noise)
//overall output result
return(output);
}
PROCEDURE :
Note: “Kindly refer the Topic Configuration of 6713 Codec using BSL”
Add the above ‘C’ source file to the current project (remove codec.c source file
from the project if you have already added).
Observe the waveform that appears on the CRO screen. Verify that the 3 KHz
noise signal is being cancelled gradually.
SPECTROGRAM
This project uses source program spectrogram_rtdx_mtl.c that runs on the DSK which
computes 256 point FFT and enables an RTDX output channel to write/send the resulting
FFT data to the PC running MATLAB for finding the spectrogram. A total of N/2 (128
points )are sent. The (.CDB) configuration file is used to set interrupt INT11. From this
configuration file select Input/Output RTDX. Right click on properties and change the
RTDX buffer size to 8200. Within CCS, select tools RTDX Configure to set the host
buffer size to 2048(from 1024).
An input signal is read in blocks of 256 samples. Each block of data is then multiplied with a
hamming window of length 256 points. The FFT of the windowed data is calculated and
squared. Half of the resulting FFT of each block of 256 points is then transferred to the PC
running MATLAB to find the specrtrogram.
main()
{
for (i = 0 ; i<PTS ; i++) //set up twiddle
constants in w
{
w[i].real = cos(2*PI*i/512.0); //Re component of twiddle
constants
w[i].imag =-sin(2*PI*i/512.0); //Im component of twiddle
constants
}
comm_intr(); //init DSK, codec,
McBSP
if ~isenabled(cc.rtdx);
end
isenabled(cc.rtdx,'ochan');
N = round(M/2);
f=((0:(M-1)/2)/(M-1))*fs;
set(gcf,'DoubleBuffer','on');
y = ones(N,B);
column = 1;
set(gca,'NextPlot','add');
axes_handle = get(gcf,'CurrentAxes');
set(get(axes_handle,'XLabel'),'String','Time (s)');
set(get(axes_handle,'YLabel'),'String','Frequency (Hz)');
set(get(axes_handle,'Title'),'String','\fontname{times}\bf Real-Time
Spectrogram');
set(gca,'XLim', [0 4.096]);
set(gca,'YLim', [0 4000]);
set(gca,'XLimMode','manual');
set(gca,'YLimMode','manual');
for i = 1:32768
w=double(w(1:N));
column = mod(column, B) + 1;
end
Procedure:
17. Copy the following files from the CD to your new project folder
1) c6713dskinit . c
2) FFT.c
3) spectrogram_rtdx_mtl.c
4) c6713dskinit . h
5) hamming.cof
6) spectrogram_RTDX.m
Path “C:\CCStudio\C6000\dsk6713\lib\dsk6713bsl.lib”
7. Build project.
7. Close CCS
Twiddle Factor
In the Definition of the DFT, there is a factor called the Twiddle Factor
Note that
The Fast Fourier Transform is a simply a method of laying out the computation, which is
much faster for large values of N, where N is the number of samples in the sequence. It is
an ingenious way of achieving rather than the DFT's clumsy P^2 timing.
The idea behind the FFT is the divide and conquer approach, to break up the original N
point sample into two (N / 2) sequences. This is because a series of smaller problems is
easier to solve than one large one. The DFT requires (N-1)^2 complex multiplications and
N(N-1) complex additions as opposed to the FFT's approach of breaking it down into a
series of 2 point samples which only require 1 multiplication and 2 additions and the
recombination of the points which is minimal.
For example Seismic Data contains hundreds of thousands of samples and would take
months to evaluate the DFT. Therefore we use the FFT.
FFT Algorithm
The FFT has a fairly easy algorithm to implement, and it is shown step by step in the list
below. Thjis version of the FFT is the Decimation in Time Method
1. Pad input sequence, of N samples, with ZERO's until the number of samples is the
nearest power of two.
6. Until the all the samples combine into one N-sample DFT
Shuffled Inputs
The process of decimating the signal in the time domain has caused the INPUT samples
to be re-ordered. For an 8 point signal the original order of the samples is
0, 1, 2, 3, 4, 5, 6, 7
0, 4, 2, 6, 1, 5, 3, 7
At first it may look as if there is no order to this new sequence, BUT if the numbers are
What has happened is that the bit patterns representing the sample number has been
reversed. This new sequence is the order that the samples enter the FFT.
main()
{
for (i = 0 ; i<PTS ; i++) // set up twiddle constants in w
{
w[i].real = cos(2*PI*i/(PTS*2.0)); //Re component of twiddle
constants
w[i].imag =-sin(2*PI*i/(PTS*2.0)); //Im component of twiddle
constants
}
} //end of main
fft.c:
do
{
num_stages +=1;
i = i*2;
}while (i!=N);
leg_diff = N/2; //difference between upper&lower legs
step = (PTS*2)/N; //step between values in twiddle.h
for (i = 0;i < num_stages; i++) //for N-point FFT
{
index = 0;
for (j = 0; j < leg_diff; j++)
{
if (i<j)
{
temp1.real = (Y[j]).real;
temp1.imag = (Y[j]).imag;
(Y[j]).real = (Y[i]).real;
(Y[j]).imag = (Y[i]).imag;
(Y[i]).real = temp1.real;
(Y[i]).imag = temp1.imag;
}
}
return;
}
Input:
Output:
HOW TO PROCEED
Open Code Composer Studio, make sure the DSP kit is turned on.
Add the source files “FFT256.c“ and “FFT.C” in the project using
‘Projectadd files to project’ pull down menu.
Load the program in program memory of DSP chip using the ‘File-load program’
pull down menu.
POWER SPECTRUM
The total or the average power in a signal is often not of as great an interest. We are most
often interested in the PSD or the Power Spectrum. We often want to see is how the
input power has been redistributed by the channel and in this frequency-based
redistribution of power is where most of the interesting information lies. The total area
under the Power Spectrum or PSD is equal to the total avg. power of the signal. The PSD
is an even function of frequency or in other words
To compute PSD:
The value of the auto-correlation function at zero-time equals the total power in the signal.
To compute PSD We compute the auto-correlation of the signal and then take its FFT.
The auto-correlation function and PSD are a Fourier transform pair. (Another estimation
method called “period gram” uses sampled FFT to compute the PSD.)
N
1
= lim
N → ∞ N
∑
n =1
x(n ) x (n + τ )
1
∫ S (ω ) e
−1 jω τ
R (τ ) = F T ( S ( ω )) = dω
2π
PSD.c:
/*************************************************************
* FILENAME
* Non_real_time_PSD.c
* DESCRIPTION
* Program to Compute Non real time PSD
* using the TMS320C6711 DSK.
***************************************************************
* DESCRIPTION
* Number of points for FFT (PTS)
* x --> Sine Wave Co-Efficients
* iobuffer --> Out put of Auto Correlation.
* x1 --> use in graph window to view PSD
/*===========================================================*/
#include <math.h>
#define PTS 128 //# of points for FFT
#define PI 3.14159265358979
main()
{
float j,sum=0.0 ;
int n,k,i,a;
for (i = 0 ; i<PTS ; i++) // set up twiddle constants in w
{
w[i].real = cos(2*PI*i/(PTS*2.0));
/*Re component of twiddle constants*/
w[i].imag =-sin(2*PI*i/(PTS*2.0));
/*Im component of twiddle constants*/
}
for(i=0,j=0;i<PTS;i++)
{ x[i] = sin(2*PI*5*i/PTS);
// Signal x(Fs)=sin(2*pi*f*i/Fs);
samples[i].real=0.0;
samples[i].imag=0.0;
}
for(n=0;n<PTS;n++)
{
sum=0;
for(k=0;k<PTS-n;k++)
{
sum=sum+(x[k]*x[n+k]); // Auto Correlation R(t)
}
iobuffer[n] = sum;
}
} //end of main
FFT.c:
HOW TO PROCEED
Open Code Composer Studio, make sure the DSP kit is turned on.
Add the source files “PSD.c“ and “FFT.c” in the project using
‘Projectadd files to project’ pull down menu.
Load the program in program memory of DSP chip using the ‘File-load program’
pull down menu.
OUT PUT:
MINI PROJECT
(DISCRETE COSINE TRANSFORM)
The discrete cosine transform (DCT) helps separate the image into parts (or spectral sub-
bands) of differing importance (with respect to the image's visual quality). The DCT is
similar to the discrete Fourier transform: it transforms a signal or image from the spatial
domain to the frequency domain. With an input image, A, the coefficients for the output
"image," B, are:
The input image is N2 pixels wide by N1 pixels high; A(i,j) is the intensity of the pixel in
row i and column j; B(k1,k2) is the DCT coefficient in row k1 and column k2 of the DCT
matrix. All DCT multiplications are real. This lowers the number of required
multiplications, as compared to the discrete Fourier transform. The DCT input is an 8 by 8
array of integers. This array contains each pixel's gray scale level; 8 bit pixels have levels
from 0 to 255. The output array of DCT coefficients contains integers; these can range
from -1024 to 1023. For most images, much of the signal energy lies at low frequencies;
these appear in the upper left corner of the DCT. The lower right values represent higher
frequencies, and are often small - small enough to be neglected with little visible
distortion.
IMPLEMENTATION OF DCT
DCT-based codecs use a two-dimensional version of the transform.
The 2-D DCT and its inverse (IDCT) of an N x N block are shown below:
2-D DCT:
2 N −1 N −1
( 2 x + 1)uπ ( 2 y + 1)vπ
F (u , v ) = C (u )C (v )∑∑ f ( x, y ) cos[ ] cos[ ]
N y =0 x =0 2 N 2 N
2-D IDCT:
2 N −1 N −1
(2 x + 1)uπ (2 y + 1)vπ
f ( x, y ) =
N
∑∑ C (u )C (v) F (u, v) cos[
v = 0 u =0 2N
] cos[
2N
]
One of the properties of the 2-D DCT is that it is separable meaning that it can be
separated into a pair of 1-D DCTs. To obtain the 2-D DCT of a block a 1-D DCT is
first performed on the rows of the block then a 1-D DCT is performed on the
columns of the resulting block.
The same applies to the IDCT.
This process is illustrated below.
Note that the values in the decimal format does not include the factor
[Sqrt(2/n)=>sqrt(2/8)=>1/2]. The reason for this is that dividing the coefficients by 2 before
converting to Q12 may result in some loss in precision. More precision can be obtained
by ignoring this division and then multiplying by 211 (instead of 212 ) to convert to Q12.
The reason for using Q12 instead of Q15 (as one would expect) is as follows. Referring to
Equation [3], we notice that the DCT calculation involves a summation of N terms.
Looking at the DCT coefficients in Figure 1, we observe that the terms entering in the
summation may be close to 1. Thus, such summation may cause overflows. To avoid this,
each term must be scaled down by 1/N. For N=8, this can be achieved by working in Q12
format instead of Q15 format.
HOW TO PROCEED:
Open Code Composer Studio, make sure the DSP kit is turned on.
Add the source files “main.c“ ,”dct.c” and “idct.c” in the project using
‘Projectadd files to project’ pull down menu.
Copy the header files “scenary.h” and “dct.h” and paste it in your project folder.
Load the program in program memory of DSP chip using the ‘File-load program’
pull down menu.
Main.c:
#include <stdio.h>
#include <stdlib.h>
#include "dct.h"
#include "scenary.h" /* Header file containing input image as a 1D
array */
void main()
{
int i,x;
dct.c:
/*********************************************************************/
/* dct.c Function to perform a 8 point 2D DCT
*/
/* DCT is performed using direct matrix multiplication
*/
/*********************************************************************/
#include "dct.h"
void dct(void)
{
int i,j,x,y;
int value[8];
for(x=0;x<8;++x)
{
value[y] += (int)(coe[y][x]*block[j+(x*8)]);
}
}
for(y=0;y<8;++y)
{
block[j+(y*8)] = (short)(value[y]>>12);
}
}
idct.c:
/*********************************************************************/
/* idct.c performs a 8 point 2D Inverse DCT function
*/
/*********************************************************************/
#include "dct.h"
void idct(void)
{
int i,j,x,y;
int value[8];
for(x=0;x<8;++x)
{
value[y] += (int)(coe[x][y]*block[j+(x*8)]);
}
}
for(y=0;y<8;++y)
{
block[j+(y*8)] = (short)(value[y]>>12);
}
}
for(x=0;x<8;++x)
{
value[y] += (int)(coe[x][y]*block[i+x]);
}
}
for(y=0;y<8;++y)
{
block[i+y] = (short)(value[y]>>15);
}
}
}
MY_LNK_CMD.cmd:
-l imagecfg.cmd
SECTIONS
{
image_in:
image_out: