Full Version : Onn-Ong Spectrum Analyzer (ASM)
avr >>PROJECTS (AVR) >>Onn-Ong Spectrum Analyzer (ASM)


AVR_Admin- 04-22-2006
Spectrum Analyzer Fayaz Onn & Lisa Ong

Overview & Design Rationale


Spectrum analyzers are used to output the frequency content of an arbitrary input signal. It was our opinion that such a system could be implemented on a microcontroller, almost fully in software. Doing this, however, necessitated some knowledge of standard Digital Signal Processing techniques, namely sampling, analog-to-digital conversion and most importantly constructing digital filters. We believed that a spectrum analyzer could be fully described by providing and/or implementing three main components: sampling & A/D conversion, filtering and output.

Hardware was essential to our project. The ATMEL AT90S8535 provided a sampling and Analog-to-Digital module which greatly facilated the capturing of analog signal for subsequent processing. Of course, using this particular microcontroller put constraints on the capacity and capability of our spectrum analyzer. Due to these constraints, we had to design the analyzer within the appropriate limits. The main constraints imposed by the microcontroller were the maximum sampling frequency (of approximately 9 kHz), RAM and Program Memory. All three factors contributed to limiting the bandwidth, performance and resolution of the analyzer.

In essence, we believed that a spectrum analyzer could be realized through chaining a series of bandpass filters, through which an input signal would traverse during the filtering process. Hence, the major portion of this project involved coding up and testing the various filters that later become the 'frequency points of interest' of our analyzer. We tried several filter design techniques to implement a reliable bandpass filter, i.e. a filter with a relatively short passband and sharp roll-off. The two main classes of filters we explored were IIR and FIR filters (please see section entitled 'Filter Concepts' for futher detail). However, progressively filtering an input signal was insufficient to establish the presence of a particular frequency (or range of frequencies). Therefore, we had to include some thresholding on the final filtered output to determine the presence of a specific frequency.

Nevertheless, we managed to implement a spectrum analyzer that can process and output the frequencies present in an input signal, with reasonable accuracy.


Link: http://instruct1.cit.cornell.edu/courses/e...cts/s1999/lisa/


AVR_Admin- 04-22-2006
CODE

;* Fayaz Onn, Lisa Ong. May 1999, for EE 476 Final Project
;* Macros File for Spectrum Analyzer
;*

;Definitions:
;op1L = r16
;op1H = r17
;op2L = r18
;op2H = r19

; This macro copys the 16 bit value in op2 to op1
.macro movop1
mov op1H, op2H
mov op1L, op2L
.endmacro

; This macro loads 16 bit constants into r16, r17
.macro  loadop1c ;for const
ldi op1H, @0
ldi op1L, @1
.endmacro

; This macro moves the 16 bit value from op2 into 2 registers
.macro storeop2
mov @0, op2H
mov @1, op2L
.endmacro

;This macro loads the 16 bit value from 2 registers into op2
.macro loadop2
mov op2H, @0
mov op2L, @1
.endmacro

;This macro loads the 16 bit value from 2 registers into op1
.macro loadop1
mov op1H, @0
mov op1L, @1
.endmacro




AVR_Admin- 04-22-2006
CODE

; Fayaz Onn, Lisa Ong
; EE 476 Final Project: Spectrum Analyzer
; Sp 1999


;SAMPLING AT 9000Hz
;FIR BANDPASS FILTERS WITH 100 POLES
; yn = b0*xn + b1*xn1 + b2*xn2 + ... + b1000*x100

.nolist
.include "8535def.inc"
.device AT90S8535
.list

.def save  = r15;SREG temp reg
.def temp  = r23;temporary register
.def temp2  = r24
.def scount  = r25;sample count for recording and playback
.def count   = r26;general purpose counter
.def levelcnt = r27;level counter

.def    freqpresent     = r16

.def    op1L  = r16
.def    op1H  = r17
.def    op2L  = r18
.def    op2H  = r19

;***** Sampled and calculated values
.def xnL =r2; holds x variables
.def xnH =r3
.def ynL =r4; y[n]
.def ynH =r5
.def filtercnt = r6
.def    leveladdrH = r7
.def leveladdrL = r8
.def thresaddrH = r9
.def thresaddrL = r10
.def thresvalueH = r11
.def thresvalueL = r12

;***** mpy16u Register Variables
.def mc16uL =r16 ;multiplicand low byte
.def mc16uH =r17 ;multiplicand high byte
.def mp16uL =r18 ;multiplier low byte
.def mp16uH =r19 ;multiplier high byte
.def m16u0 =r18 ;result byte 0 (LSB)
.def m16u1 =r19 ;result byte 1
.def m16u2 =r20 ;result byte 2
.def m16u3 =r21 ;result byte 3 (MSB)
.def mcnt16u =r22 ;loop counter

;******** UART registers  
.def    TXbusy  =r20   ;transmit busy flag
.def    RXchar  =r21   ;a received character
.def    TXflash =r22   ;text to be sent is in flash if <>0

.equ    baud96  =25    ;9600 baud constant for 4Mhz crystal
.equ    azero   ='0'   ;0x30 ascii '0'

.equ NUMSAM  = 238;number of samples
.equ FILTERS  = 8  ;number of filters
.equ POLES  = 101 ; poles+1

;**** Thresholds of level counts ******
.nolist
.include "firmac.asm" ;macros file
.list

.dseg
samples: .byte   476
levels: .byte 16

;define variable strings to be tranmitted from RAM
cntstr: .byte   4      ;a three digit count + a zero terminate
fp: .byte 16

;***** Initialization
.cseg
.org $0000
rjmp  RESET;reset entry vector
reti  
reti
reti
reti
reti
reti
reti
reti
reti
reti  
reti
       rjmp    TXempty;UART buffer empty
       reti
rjmp adcdone
reti
reti


;define fixed strings to be tranmitted from flash- zero terminated
text:   .db     "Frequency Analyzer",0x00
crlf:   .db     0x0d, 0x0a, 0x00       ;carrage return/line feed

limit:  .db 01, 01, 01, 01
.db 01, 01, 01, 01  
.db 0xff, 0xff, 0xff, 0xff
.db  0xff, 0xff, 0xff, 0xff


f200: .db "0180-0220Hz:",0x00
f400:   .db     "0380-0420Hz:",0x00
f600: .db "0580-0620Hz:",0x00
f800: .db "0780-0820Hz:",0x00
f1000:  .db "0980-1020Hz:",0x00
f1200: .db "1180-1220Hz:",0x00
f1400: .db "1380-1420Hz:",0x00
f1600: .db "1600-1700Hz:",0x00

f0100: .db 0x00

yes:    .db  "yes", 0x00
no: .db "no",0x00

.include "square.asm"

.nolist
.include "coeffs.asm"  
.list

RESET: ldi temp, LOW(RAMEND);setup stack pointer
out  SPL, temp
ldi temp, HIGH(RAMEND)
out SPH, temp

ldi scount, NUMSAM;load number of samples
clr xnH ;clear working registers
clr xnL
clr ynH
clr ynL
clr levelCnt
ldi ZL, low(levels)
ldi ZH, high(levels)
mov leveladdrL, r30
mov leveladdrH, r31

ldi ZL, low(threslevel<<1)
ldi ZH, high(threslevel<<1)
mov thresaddrL, r30
mov thresaddrH, r31

;set up analog converter to read channel zero Pin A0
ldi temp, 0
out ADMUX, temp

; ADC freerun mode, prescale 32 (for 4MHz), interrupt on sample done
ldi temp, 0b11101101
out ADCSR, temp
ldi ZL, low(samples)
ldi  ZH, high(samples)
sei;enable all interrupts

; ********** Freerun Sampling loop ***************

swait: tst scount
breq output  
rjmp swait

;************************************************

; After NUMSAM samples
output:
;disable ADC
clr temp
out ADCSR, temp

ldi YL, low(coeff<<1);load filter coefficients
ldi YH, high(coeff<<1)
ldi temp, FILTERS ;# of filters
mov filtercnt, temp

;t0 interrupt to play back y samples
;ldi temp,  exp2(TOIE0)
;out TIMSK, temp
;ldi temp,0b00000101
;out TCCR0, temp

; loops changes bandpass filters
outerloop:
mov temp, filtercnt; compare with count of 10 filters
tst  temp
breq outerdone
dec temp ;else decrement filtercnt
mov filtercnt, temp

mov r31, thresaddrH
mov r30, thresaddrL; <**********************************************
lpm
mov thresvalueH, r0
adiw ZL, 1
lpm
mov thresvalueL, r0
adiw ZL, 1
mov thresaddrH, r31
mov thresaddrL, r30

ldi ZL, low(samples)
ldi ZH, high(samples)
ldi scount, (NUMSAM-POLES + 1) ;scount = number of processing samples = 250
push r29 ;store initial Y for each different filter
push r28
clr levelcnt

filterlp:
tst scount
breq done
dec scount
pop r28 ;restores r28, 29
pop r29
push r29 ;store back on stack for next diffeq
push r28
rcall diffeq ; yn <- difference eqn
mov temp, ynH; negative values??
cpi temp, 0b10000000
brsh zeroit        

;threshold
cont1:  
mov temp2, ynH
mov temp, ynL

cp temp2, thresvalueH
brlo cont2
breq checklow
brsh increaseCnt

checklow:
cp temp, thresvalueL
brlo cont2
brsh increaseCnt

; display y's or x's
cont2:  
mov temp2, ynH
mov temp, ynL
rjmp filterlp  

; after 240 samples processed
done:
mov r30, leveladdrL
mov r31, leveladdrH
st Z+, levelcnt
mov leveladdrL, r30
mov leveladdrH, r31

; indicate time for next filter
pop temp  ;dump old initializing
pop temp  ;value of Y
rjmp outerloop

zeroit:
clr temp
mov ynH, temp
mov ynL, temp
rjmp cont1

increaseCnt:
inc levelCnt
rjmp cont2


outerdone:; the end of it all (Uart Code)
;*************************************************************
; limit maximum # filters to 16 for the meantime
clr freqpresent; overrides r16 = op1L
clr  count
ldi ZL, low(levels)
ldi ZH, high(levels)
mov leveladdrH, r31
mov leveladdrL, r30

ldi YL, low(fp); addr for freq present
ldi YH, high(fp)

ldi ZL, low(limit<<1)
ldi ZH, high(limit<<1)
mov r18, r31;store limit addr
mov r17, r30

compare:
mov r31, leveladdrH;addr for levels
mov r30, leveladdrL
ld levelcnt, Z+
mov leveladdrH, r31
mov leveladdrL, r30

mov r31, r18
mov r30, r17
lpm
adiw ZL, 1
mov r18, r31
mov r17, r30
cp levelcnt, r0
brsh set_yes
set_no: clr freqpresent
rjmp jump
set_yes:
ser freqpresent
jump:
;store byte for freq present
st Y+, freqpresent
inc count
cpi count, 16
breq endcmp
rjmp compare  


;************************** Transmit to UART *****************
endcmp:
clr     TXbusy  ;start out not busy on TX

;intialize text pointer BEFORE turning on interrupts
;because RESET causes the TX empty flag to be SET
 
ldi     ZL, LOW(text<<1)
       ldi     ZH, HIGH(text<<1)

;setup UART -- enable TXempty and TX pin
       ldi     temp, 0b00001000
       out     UCR, temp
;set baud rate to 9600
       ldi     temp, baud96
       out     UBRR, temp

ldi     ZL, LOW(text<<1)
       ldi     ZH, HIGH(text<<1)
lpm
       out     UDR, r0        ;trigger the UART TX
       ser     TXflash        ;text string in flash memory
       ser     TXbusy         ;and set the TX busy flag
       sbi     UCR, UDRIE     ;enable the TXempty interrupt
       rcall   TXwait

ldi     ZL, LOW(crlf<<1) ;shifted becuase pgm memory is words
       ldi     ZH, HIGH(crlf<<1)
       lpm
       out     UDR, r0        ;trigger the UART TX
       ser     TXflash        ;text string in flash memory
       ser     TXbusy         ;and set the TX busy flag
       sbi     UCR, UDRIE     ;enable the TXempty interrupt
       rcall   TXwait
     
ldi temp, FILTERS
mov filtercnt, temp
ldi YL, low(levels) ;initialize to stored threshold level data
ldi YH, high(levels)  

ldi     ZL, LOW(f200<<1)  
       ldi     ZH, HIGH(f200<<1)
mov thresaddrL, r30
mov thresaddrH, r31
clr scount

mov filtercnt, temp
ldi YL, low(levels) ;initialize to stored threshold level data
ldi YH, high(levels)  


;Loop and Print threshold level counts to RS232 serial port via UART
format:
mov temp, filtercnt
tst temp
breq finallydone
dec temp
mov filtercnt, temp

mov r30, thresaddrL
mov r31, thresaddrH
push r30
push r31
adiw ZL, 14
mov thresaddrL, r30
mov thresaddrH, r31
pop r31
pop r30
lpm                    ;put the char in r0
       out     UDR, r0        ;put the character in the UART buffer
       ser     TXflash        ;string is in flash memory
       ser     TXbusy         ;and set the TX busy flag
       sbi     UCR, UDRIE     ;enable the TXempty interrupt
       rcall   TXwait         ;chill until done


;load the above threshold counts from memory
ld levelcnt, Y+
ldi temp2, azero;load ascii zero

;format the number into an ascii string  
hundreds:
cpi    levelcnt, 100
brlo   storehun
subi   levelcnt, 100
inc    temp2
rjmp   hundreds
storehun:
ldi     ZL, LOW(cntstr) ;storage space for formatted ascii digits
       ldi     ZH, HIGH(cntstr)
st Z+, temp2;store hundreds digit
ldi temp2, azero

tens: cpi levelcnt, 10
brlo storeten
subi levelcnt, 10
inc temp2
rjmp tens
storeten:
st   Z+, temp2;store tens digit      
subi levelcnt, -azero  
st Z+, levelcnt;store ones digit
       clr     temp ;terminating zero
       st      Z, temp

ldi     ZL, LOW(cntstr) ;ptr to RAM
       ldi     ZH, HIGH(cntstr)
       ld      r0,Z
       out     UDR, r0        ;fire off the UART transmit
       clr     TXflash        ;the string is in RAM
       ser     TXbusy         ;and set the TX busy flag
       sbi     UCR, UDRIE     ;enable the TXempty interrupt
       rcall   TXwait
       
      ;setup ptr for <crlf> string
       ldi     ZL, LOW(crlf<<1) ;shifted becuase pgm memory is words
       ldi     ZH, HIGH(crlf<<1)
       lpm
       out     UDR, r0        ;trigger the UART TX
       ser     TXflash        ;text string in flash memory
       ser     TXbusy         ;and set the TX busy flag
       sbi     UCR, UDRIE     ;enable the TXempty interrupt
       rcall   TXwait
rjmp format
 


finallydone: rjmp   finallydone


;***************************** ISRS **************************

adcdone:
in save, SREG
in temp, ADCL;read the voltage
in temp2, ADCH
; Take 240 samples of x[n] and store in SRAM
st Z+, temp;store low byte first
st Z+, temp2
dec scount
out SREG,save
reti

t0overflow:
in  save, SREG
dec count
out SREG, save
reti

TXempty:in      save, SREG   ;save processor status
       tst     TXflash        ;Is the string in flash memory?
       breq    TXram          ;If not, it is in RAM
       inc     ZL             ;get the next char from flash                  
       lpm                    ;and put it in r0
       rjmp    TXfls
TXram:  inc     ZL             ;get the next char from RAM
       ld      r0,Z
TXfls:  tst     r0             ;if char is zero then exit
       breq    TXend          
       out     UDR, r0        ;otherwise transmit it
       rjmp    TXexit         ;exit until next char
TXend:  clr     TXbusy         ;no more chars
       cbi     UCR, UDRIE     ;clear the TXempty interrupt
TXexit: out     SREG, save   ;restore proc status
       reti                   ;back to pgm


TXwait: tst     TXbusy         ;now wait for the tranmission to finish
       brne    TXwait
       ret


;****************************** SUBS **************************
; Difference Equation
; yn = b0*xn + b1*xn1 + b2*xn2 + b3*xn3 + b4*xn4 +.....+ b100*xn100

diffeq:
push r31; store values of ZL and ZH
push r30; to point to correct address next time

clr  temp2; clear yn
mov ynH, temp2
mov ynL, temp2
ldi count, POLES

; loop POLES times add running sum
; yn = yn + sum of bi*x[n-i] for i=0 to 100

runninglp:
ld xnL, Z+; load x[n-6] first
ld xnH, Z+
push r30
push r31
mov r30, r28
mov r31, r29; lpm wants Z register
lpm  ; get upper byte of coeff
mov r1, r0 ; store it in r1
adiw ZL, 1
lpm  ; get lower byte of coeff in r0
pop r31 ; restore Z value
pop r30
adiw YL, 2 ; point to next coeff
loadop1  r1, r0
loadop2  xnH, xnL
cpi  op1H, 0b10000000
brsh  subit
rcall   multiply
loadop1  ynH, ynL
rcall  add16
back: storeop2  ynH, ynL ; <--------- running sum
dec  count
brne  runninglp
rjmp  exitrunning

subit:
;take 2's complement
com op1L
com op1H
subi op1L, -1
tst op1L
brne noovfl ;if op1L = 0 after adding 1 then overflow occurred
subi op1H, -1
noovfl: rcall  multiply;result is in op2
movop1  ;move the thing we want to subtract to op1
loadop2  ynH, ynL
rcall  sub16
rjmp  back

exitrunning:

; make Z point to next x[n-6]
pop  r30
pop  r31
adiw  ZL, 2
ret


;********** computational subroutines
add16: ;op1+op2 -> op2.  
add op2L, op1L
adc op2H, op1H
ret

sub16:  ;op2-op1 -> op2
sub op2L, op1L
sbc op2H, op1H
ret

multiply:;op2 * op1 -> op2
rcall mpy16u
cpi r18, 0x80;lowest byte>125, add one to answer (round up 0.5)
brlo skipadd
  ; Note: brcc doesn't seem to work here. Seems like carry is ALWAYS set.
subi r19, -1 ; the ONLY time overflow actually occurs is if r19= 0xff
cpi r19, 0x00; Hence, if r19+1 = 0x00 then add one to r20
brne skipadd
subi r20, -1
skipadd:mov r18, r19;result is only 10 bits, hopefully.......
mov  r19, r20
mov r20, r21
lsr r20
ror r19 ;triple precision shift
ror r18 ;right 4 times
lsr r20
ror r19
ror r18
lsr r20
ror r19
ror r18
lsr r20
ror r19 ;answer is in r19, r18.  y*65536/256/16
ror r18
ret


;***************************************************************************
;*
;* "mpy16u" - 16x16 Bit Unsigned Multiplication
;*
;***************************************************************************

mpy16u: clr m16u3 ;clear 2 highest bytes of result
clr m16u2
ldi mcnt16u,16;init loop counter
lsr mp16uH
ror mp16uL

m16u_1: brcc noad8 ;if bit 0 of multiplier set
add m16u2,mc16uL;add multiplicand Low to byte 2 of res
adc m16u3,mc16uH;add multiplicand high to byte 3 of res
noad8: ror m16u3 ;shift right result byte 3
ror m16u2 ;rotate right result byte 2
ror m16u1 ;rotate result byte 1 and multiplier High
ror m16u0 ;rotate result byte 0 and multiplier Low
dec mcnt16u ;decrement loop counter
brne m16u_1 ;if not done, loop more
ret
;-

AVR_Admin- 04-22-2006
CODE

; Each coefficient is encoded as HighByte, LowByte
; 2's complement used for negative numbers
; total of 101 coefficients (b0, b1, b2,....,b100)
; These Coefficients are generated using Matlab FIR function
; Sampling Frequency = 9000Hz.  

; 180-220 Hz, 100 poles bandpass FIR filter
coeff: .db 0x00 ,0x88, 0x00 ,0x99
.db 0x00 ,0xAC, 0x00 ,0xBF
.db 0x00 ,0xD4, 0x00 ,0xEA
.db 0x00 ,0xFE, 0x01 ,0x11
.db 0x01 ,0x20, 0x01 ,0x2A
.db 0x01 ,0x2B, 0x01 ,0x22
.db 0x01 ,0x0D, 0x00 ,0xE9
.db 0x00 ,0xB6, 0x00 ,0x71
.db 0x00 ,0x1C, 0xFF ,0xB6
.db 0xFF ,0x40, 0xFE ,0xBC
.db 0xFE ,0x2D, 0xFD ,0x97
.db 0xFC ,0xFC, 0xFC ,0x62
.db 0xFB ,0xCE, 0xFB ,0x46
.db 0xFA ,0xCE, 0xFA ,0x6B
.db 0xFA ,0x24, 0xF9 ,0xFC
.db 0xF9 ,0xF7, 0xFA ,0x18
.db 0xFA ,0x60, 0xFA ,0xD0
.db 0xFB ,0x69, 0xFC ,0x26
.db 0xFD ,0x07, 0xFE ,0x06
.db 0xFF ,0x1D, 0x00 ,0x48
.db 0x01 ,0x7D, 0x02 ,0xB7
.db 0x03 ,0xEC, 0x05 ,0x14
.db 0x06 ,0x28, 0x07 ,0x20
.db 0x07 ,0xF5, 0x08 ,0xA1
.db 0x09 ,0x20, 0x09 ,0x6E
.db 0x09 ,0x88, 0x09 ,0x6E
.db 0x09 ,0x20, 0x08 ,0xA1
.db 0x07 ,0xF5, 0x07 ,0x20
.db 0x06 ,0x28, 0x05 ,0x14
.db 0x03 ,0xEC, 0x02 ,0xB7
.db 0x01 ,0x7D, 0x00 ,0x48
.db 0xFF ,0x1D, 0xFE ,0x06
.db 0xFD ,0x07, 0xFC ,0x26
.db 0xFB ,0x69, 0xFA ,0xD0
.db 0xFA ,0x60, 0xFA ,0x18
.db 0xF9 ,0xF7, 0xF9 ,0xFC
.db 0xFA ,0x24, 0xFA ,0x6B
.db 0xFA ,0xCE, 0xFB ,0x46
.db 0xFB ,0xCE, 0xFC ,0x62
.db 0xFC ,0xFC, 0xFD ,0x97
.db 0xFE ,0x2D, 0xFE ,0xBC
.db 0xFF ,0x40, 0xFF ,0xB6
.db 0x00 ,0x1C, 0x00 ,0x71
.db 0x00 ,0xB6, 0x00 ,0xE9
.db 0x01 ,0x0D, 0x01 ,0x22
.db 0x01 ,0x2B, 0x01 ,0x2A
.db 0x01 ,0x20, 0x01 ,0x11
.db 0x00 ,0xFE, 0x00 ,0xEA
.db 0x00 ,0xD4, 0x00 ,0xBF
.db 0x00 ,0xAC, 0x00 ,0x99
.db 0x00 ,0x88
; 380-420Hz, 100 poles bandpass FIR filter
coeff2: .db 0x00, 0x2a, 0x00, 0x5a
.db 0x00, 0x87, 0x00, 0xb0
.db 0x00, 0xd3, 0x00, 0xe6
.db 0x00, 0xf4, 0x00, 0xea
.db 0x00, 0xc8, 0x00, 0x8a
.db 0x00, 0x31, 0xff, 0xbe
.db 0xff, 0x38, 0xfe, 0xa9
.db 0xfe, 0x1c, 0xfd, 0xa2
.db 0xfd, 0x4b, 0xfd, 0x26
.db 0xfd, 0x3f, 0xfd, 0x9e
.db 0xfe, 0x45, 0xff, 0x2d
.db 0x00, 0x4b, 0x01, 0x89
.db 0x02, 0xce, 0x03, 0xfb
.db 0x04, 0xf3, 0x05, 0x98
.db 0x05, 0xd3, 0x05, 0x95
.db 0x04, 0xd7, 0x03, 0xa1
.db 0x02, 0x03, 0x00, 0x1a
.db 0xfe, 0x0d, 0xfc, 0x06
.db 0xfa, 0x32, 0xf8, 0xbe
.db 0xf7, 0xce, 0xf7, 0x7d
.db 0xf7, 0xd9, 0xf8, 0xe0
.db 0xfa, 0x84, 0xfc, 0xa5
.db 0xff, 0x19, 0x01, 0xaf
.db 0x04, 0x2f, 0x06, 0x63
.db 0x08, 0x1d, 0x09, 0x36
.db 0x09, 0x97, 0x09, 0x36
.db 0x08, 0x1d, 0x06, 0x63
.db 0x04, 0x2f, 0x01, 0xaf
.db 0xff, 0x19, 0xfc, 0xa5
.db 0xfa, 0x84, 0xf8, 0xe0
.db 0xf7, 0xd9, 0xf7, 0x7d
.db 0xf7, 0xce, 0xf8, 0xbe
.db 0xfa, 0x32, 0xfc, 0x06
.db 0xfe, 0x0d, 0x00, 0x1a
.db 0x02, 0x03, 0x03, 0xa1
.db 0x04, 0xd7, 0x05, 0x95
.db 0x05, 0xd3, 0x05, 0x98
.db 0x04, 0xf3, 0x03, 0xfb
.db 0x02, 0xce, 0x01, 0x89
.db 0x00, 0x4b, 0xff, 0x2d
.db 0xfe, 0x45, 0xfd, 0x9e
.db 0xfd, 0x3f, 0xfd, 0x26
.db 0xfd, 0x4b, 0xfd, 0xa2
.db 0xfe, 0x1c, 0xfe, 0xa9
.db 0xff, 0x38, 0xff, 0xbe
.db 0x00, 0x31, 0x00, 0x8a
.db 0x00, 0xc8, 0x00, 0xea
.db 0x00, 0xf4, 0x00, 0xe6
.db 0x00, 0xd3, 0x00, 0xb0
.db 0x00, 0x87, 0x00, 0x5a
       .db 0x00, 0x2a

; 580-620 Hz, 100 poles bandpass FIR filter
coeff3: .db 0xFF ,0xA1,0xFF ,0xE8
.db 0x00 ,0x36,0x00 ,0x83
.db 0x00 ,0xC4,0x00 ,0xEC
.db 0x00 ,0xEF,0x00 ,0xC5
.db 0x00 ,0x69,0xFF ,0xE3
.db 0xFF ,0x43,0xFE ,0xA6
.db 0xFE ,0x2C,0xFD ,0xF8
.db 0xFE ,0x23,0xFE ,0xB7
.db 0xFF ,0xAB,0x00 ,0xDD
.db 0x02 ,0x1A,0x03 ,0x22
.db 0x03 ,0xB7,0x03 ,0xAA
.db 0x02 ,0xE5,0x01 ,0x76
.db 0xFF ,0x90,0xFD ,0x83
.db 0xFB ,0xB2,0xFA ,0x7C
.db 0xFA ,0x2F,0xFA ,0xF0
.db 0xFC ,0xB4,0xFF ,0x3A
.db 0x02 ,0x1A,0x04 ,0xD0
.db 0x06 ,0xD5,0x07 ,0xBE
.db 0x07 ,0x4E,0x05 ,0x84
.db 0x02 ,0xA4,0xFF ,0x27
.db 0xFB ,0xAA,0xF8 ,0xD0
.db 0xF7 ,0x25,0xF7 ,0x01
.db 0xF8 ,0x74,0xFB ,0x47
.db 0xFE ,0xFD,0x02 ,0xF0
.db 0x06 ,0x69,0x08 ,0xC9
.db 0x09 ,0xA1,0x08 ,0xC9
.db 0x06 ,0x69,0x02 ,0xF0
.db 0xFE ,0xFD,0xFB ,0x47
.db 0xF8 ,0x74,0xF7 ,0x01
.db 0xF7 ,0x25,0xF8 ,0xD0
.db 0xFB ,0xAA,0xFF ,0x27
.db 0x02 ,0xA4,0x05 ,0x84
.db 0x07 ,0x4E,0x07 ,0xBE
.db 0x06 ,0xD5,0x04 ,0xD0
.db 0x02 ,0x1A,0xFF ,0x3A
.db 0xFC ,0xB4,0xFA ,0xF0
.db 0xFA ,0x2F,0xFA ,0x7C
.db 0xFB ,0xB2,0xFD ,0x83
.db 0xFF ,0x90,0x01 ,0x76
.db 0x02 ,0xE5,0x03 ,0xAA
.db 0x03 ,0xB7,0x03 ,0x22
.db 0x02 ,0x1A,0x00 ,0xDD
.db 0xFF ,0xAB,0xFE ,0xB7
.db 0xFE ,0x23,0xFD ,0xF8
.db 0xFE ,0x2C,0xFE ,0xA6
.db 0xFF ,0x43,0xFF ,0xE3
.db 0x00 ,0x69,0x00 ,0xC5
.db 0x00 ,0xEF,0x00 ,0xEC
.db 0x00 ,0xC4,0x00 ,0x83
.db 0x00 ,0x36,0xFF ,0xE8
.db 0xFF ,0xA1

; 780-820 Hz, 100 poles bandpass FIR filter
coeff4: .db 0xff, 0x4d, 0xff, 0x89
.db 0xff, 0xea, 0x00, 0x5c
.db 0x00, 0xbf, 0x00, 0xf5
.db 0x00, 0xe5, 0x00, 0x83
.db 0xff, 0xdf, 0xff, 0x21
.db 0xfe, 0x86, 0xfe, 0x4c
.db 0xfe, 0x9d, 0xff, 0x7c
.db 0x00, 0xb6, 0x01, 0xf0
.db 0x02, 0xbc, 0x02, 0xbe
.db 0x01, 0xD2, 0x00, 0x21
.db 0xfe, 0x21, 0xfc, 0x75
.db 0xfb, 0xba, 0xfc, 0x4f
.db 0xfe, 0x2f, 0x00, 0xe1
.db 0x03, 0x98, 0x05, 0x6f
.db 0x05, 0xB3, 0x04, 0x27
.db     0x01, 0x21, 0xfd, 0x7e
.db 0xfa, 0x5d, 0xf8, 0xcc
.db 0xf9, 0x69, 0xfc, 0x26
.db  0x00, 0x45, 0x04, 0x88
.db 0x07, 0x96, 0x08, 0x69
.db 0x06, 0xA3, 0x02, 0xBB
.db 0xfd, 0xd7, 0xf9, 0x78
.db   0xf7, 0x03, 0xf7, 0x46
.db  0xfa, 0x3c, 0xff, 0x03
.db  0x04, 0x26, 0x08, 0x0D
.db 0x09, 0x80, 0x08, 0x0D
.db 0x04, 0x26, 0xff, 0x03
.db 0xfa, 0x3c, 0xf7, 0x46
.db 0xf7, 0x03, 0xf9, 0x78
.db 0xfd, 0xd7, 0x02, 0xBB
.db 0x06, 0xA3, 0x08, 0x69
.db 0x07, 0x96, 0x04, 0x88
.db 0x00, 0x45, 0xfc, 0x26
.db 0xf9, 0x69, 0xf8, 0xcc
.db 0xfa, 0x5d, 0xfd, 0x7e
.db 0x01, 0x21, 0x04, 0x27
.db 0x05, 0xB3, 0x05, 0x6F
.db 0x03, 0x98, 0x00, 0xE1
.db 0xfe, 0x2f, 0xfc, 0x4f
.db 0xfb, 0xba, 0xfc, 0x75
.db 0xfe, 0x21, 0x00, 0x21
.db 0x01, 0xD2, 0x02, 0xBE
.db   0x02, 0xBC, 0x01, 0xF0
.db  0x00, 0xB6, 0xff, 0x7c
.db 0xfe, 0x94, 0xfe, 0x4c
.db 0xfe, 0x86, 0xff, 0x21
.db 0xff, 0xdf, 0x00, 0x83
.db 0x00, 0xE5, 0x00, 0xF5
.db 0x00, 0xBF, 0x00, 0x5C
.db 0xff, 0xea, 0xff, 0x89
.db 0xff, 0x4d

; 980-1020 Hz, 100 poles bandpass FIR filter
coeff5: .db 0xFF, 0x5A, 0xFF, 0x52
.db 0xFF, 0x9A, 0x00, 0x1B
.db 0x00, 0x9F, 0x00, 0xEA
.db 0x00, 0xCC, 0x00, 0x3C
.db 0xFF, 0x6C, 0xFE, 0xBB
.db 0xFE, 0x8D, 0xFF, 0x1B
.db 0x00, 0x43, 0x01, 0x89
.db 0x02, 0x43, 0x01, 0xF2
.db 0x00, 0x8C, 0xFE, 0x9B
.db 0xFD, 0x0A, 0xFC, 0xBD
.db 0xFE, 0x12, 0x00, 0x97
.db 0x03, 0x2D, 0x04, 0x82
.db 0x03, 0xBC, 0x00, 0xFD
.db 0xFD, 0x6D, 0xFA, 0xC2
.db 0xFA, 0x6B, 0xFC, 0xD1
.db 0x01, 0x02, 0x05, 0x12
.db 0x06, 0xF8, 0x05, 0x9A
.db 0x01, 0x66, 0xFC, 0x3D
.db 0xF8, 0x96, 0xF8, 0x52
.db 0xFB, 0xC1, 0x01, 0x67
.db 0x06, 0x9F, 0x08, 0xDE
.db 0x06, 0xF1, 0x01, 0xA4
.db 0xFB, 0x6A, 0xF7, 0x3A
.db 0xF7, 0x20, 0xFB, 0x3B
.db 0x01, 0xA4, 0x07, 0x35
.db 0x09, 0x93, 0x07, 0x53
.db 0x01, 0xA4, 0xFB, 0x3B
.db 0xF7, 0x20, 0xF7, 0x3A
.db 0xFB, 0x6A, 0x01, 0xA4
.db 0x06, 0xF1, 0x08, 0xDE
.db  0x06, 0x9F, 0x01, 0x67
.db 0xFB, 0xC1, 0xF8, 0x52
.db 0xF8, 0x96, 0xFC, 0x3D
.db 0x01, 0x66, 0x05, 0x9A
.db 0x06, 0xF8, 0x05, 0x12
.db 0x01, 0x02, 0xFC, 0xD1
.db 0xFA, 0x6B, 0xFA, 0xC2
.db  0xFD, 0x6D, 0x00, 0xFD
.db 0x03, 0xBC, 0x04, 0x82
.db 0x03, 0x2D, 0x00, 0x97
.db 0xFE, 0x12, 0xFC, 0xBD
.db 0xFD, 0x0A, 0xFE, 0x9B
.db 0x00, 0x8C, 0x01, 0xF2
.db 0x02, 0x43, 0x01, 0x89
.db 0x00, 0x43, 0xFF, 0x1B
.db 0xFE, 0x8D, 0xFE, 0xBB
.db 0xFF, 0x6C, 0x00, 0x3C
.db 0x00, 0xCC, 0x00, 0xEA
.db 0x00, 0x9F, 0x00, 0x1B
.db 0xFF, 0x9A, 0xFF, 0x52
.db 0xFF, 0x5A

; 1180-1220 Hz, 100 poles bandpass FIR filter
coeff6: .db 0xFF ,0xA2,0xFF ,0x4C
.db 0xFF ,0x69,0xFF ,0xF0
.db 0x00 ,0x94,0x00 ,0xEB
.db 0x00 ,0xA8,0xFF ,0xDC
.db 0xFE ,0xFC,0xFE ,0xAA
.db 0xFF ,0x44,0x00 ,0x8E
.db 0x01 ,0xB9,0x01 ,0xDE
.db 0x00 ,0xA9,0xFE ,0xB8
.db 0xFD ,0x57,0xFD ,0xA6
.db 0xFF ,0xB8,0x02 ,0x58
.db 0x03 ,0xB4,0x02 ,0x9C
.db 0xFF ,0x7F,0xFC ,0x4F
.db 0xFB ,0x54,0xFD ,0x86
.db 0x01 ,0xB8,0x05 ,0x2C
.db 0x05 ,0x5F,0x01 ,0xD9
.db 0xFC ,0xB7,0xF9 ,0x69
.db 0xFA ,0x64,0xFF ,0x4F
.db 0x05 ,0x0D,0x07 ,0xB7
.db 0x05 ,0x45,0xFF ,0x18
.db 0xF9 ,0x36,0xF7 ,0xA7
.db 0xFB ,0xAE,0x02 ,0xC9
.db 0x08 ,0x43,0x08 ,0x5A
.db 0x02 ,0xD6,0xFB ,0x4C
.db 0xF6 ,0xC1,0xF8 ,0x51
.db 0xFF ,0x03,0x06 ,0x6A
.db 0x09 ,0x97,0x06 ,0x6A
.db 0xFF ,0x03,0xF8 ,0x51
.db 0xF6 ,0xC1,0xFB ,0x4C
.db 0x02 ,0xD6,0x08 ,0x5A
.db 0x08 ,0x43,0x02 ,0xC9
.db 0xFB ,0xAE,0xF7 ,0xA7
.db 0xF9 ,0x36,0xFF ,0x18
.db 0x05 ,0x45,0x07 ,0xB7
.db 0x05 ,0x0D,0xFF ,0x4F
.db 0xFA ,0x64,0xF9 ,0x69
.db 0xFC ,0xB7,0x01 ,0xD9
.db 0x05 ,0x5F,0x05 ,0x2C
.db 0x01 ,0xB8,0xFD ,0x86
.db 0xFB ,0x54,0xFC ,0x4F
.db 0xFF ,0x7F,0x02 ,0x9C
.db 0x03 ,0xB4,0x02 ,0x58
.db 0xFF ,0xB8,0xFD ,0xA6
.db 0xFD ,0x57,0xFE ,0xB8
.db 0x00 ,0xA9,0x01 ,0xDE
.db 0x01 ,0xB9,0x00 ,0x8E
.db 0xFF ,0x44,0xFE ,0xAA
.db 0xFE ,0xFC,0xFF ,0xDC
.db 0x00 ,0xA8,0x00 ,0xEB
.db 0x00 ,0x94,0xFF ,0xF0
.db 0xFF ,0x69,0xFF ,0x4C
.db 0xFF ,0xA2


; 1380-1420 Hz, 100 poles bandpass FIR filter
coeff7: .db 0x00 ,0x1F,0xFF ,0x7C
.db 0xFF ,0x46,0xFF ,0xB4
.db 0x00 ,0x79,0x00 ,0xEC
.db 0x00 ,0x91,0xFF ,0x95
.db 0xFE ,0xC9,0xFF ,0x02
.db 0x00 ,0x44,0x01 ,0x8D
.db 0x01 ,0x97,0x00 ,0x12
.db 0xFE ,0x29,0xFD ,0xA9
.db 0xFF ,0x58,0x01 ,0xFA
.db 0x03 ,0x2B,0x01 ,0x83
.db 0xFE ,0x25,0xFC ,0x08
.db 0xFD ,0x62,0x01 ,0x66
.db 0x04 ,0x9E,0x03 ,0xE5
.db 0xFF ,0x71,0xFB ,0x04
.db 0xFA ,0xC5,0xFF ,0x5A
.db 0x04 ,0xF5,0x06 ,0x7A
.db 0x02 ,0x29,0xFB ,0x8A
.db 0xF8 ,0x86,0xFC ,0x23
.db 0x03 ,0x7D,0x08 ,0x17
.db 0x05 ,0x9A,0xFD ,0xEE
.db 0xF7 ,0xCB,0xF8 ,0xCD
.db 0x00 ,0x51,0x07 ,0xC7
.db 0x08 ,0x7C,0x01 ,0xA1
.db 0xF9 ,0x31,0xF6 ,0xAE
.db 0xFC ,0x6A,0x05 ,0x5E
.db 0x09 ,0x9C,0x05 ,0x5E
.db 0xFC ,0x6A,0xF6 ,0xAE
.db 0xF9 ,0x31,0x01 ,0xA1
.db 0x08 ,0x7C,0x07 ,0xC7
.db 0x00 ,0x51,0xF8 ,0xCD
.db 0xF7 ,0xCB,0xFD ,0xEE
.db 0x05 ,0x9A,0x08 ,0x17
.db 0x03 ,0x7D,0xFC ,0x23
.db 0xF8 ,0x86,0xFB ,0x8A
.db 0x02 ,0x29,0x06 ,0x7A
.db 0x04 ,0xF5,0xFF ,0x5A
.db 0xFA ,0xC5,0xFB ,0x04
.db 0xFF ,0x71,0x03 ,0xE5
.db 0x04 ,0x9E,0x01 ,0x66
.db 0xFD ,0x62,0xFC ,0x08
.db 0xFE ,0x25,0x01 ,0x83
.db 0x03 ,0x2B,0x01 ,0xFA
.db 0xFF ,0x58,0xFD ,0xA9
.db 0xFE ,0x29,0x00 ,0x12
.db 0x01 ,0x97,0x01 ,0x8D
.db 0x00 ,0x44,0xFF ,0x02
.db 0xFE ,0xC9,0xFF ,0x95
.db 0x00 ,0x91,0x00 ,0xEC
.db 0x00 ,0x79,0xFF ,0xB4
.db 0xFF ,0x46,0xFF ,0x7C
.db 0x00 ,0x1F

; 1680-1750 Hz, 100 poles bandpass FIR filter
coeff8: .db 0xFF ,0xA2, 0x00 ,0x58
.db 0x00 ,0xBE, 0x00 ,0x69
.db 0xFF ,0x98, 0xFF ,0x15
.db 0xFF ,0x79, 0x00 ,0x89
.db 0x01 ,0x3D, 0x00 ,0xB7
.db 0xFF ,0x44, 0xFE ,0x4E
.db 0xFF ,0x08, 0x00 ,0xFF
.db 0x02 ,0x45, 0x01 ,0x48
.db 0xFE ,0xB0, 0xFD ,0x0D
.db 0xFE ,0x5B, 0x01 ,0xAD
.db 0x03 ,0xB5, 0x02 ,0x0A
.db 0xFD ,0xEE, 0xFB ,0x7A
.db 0xFD ,0x8B, 0x02 ,0x7C
.db 0x05 ,0x5C, 0x02 ,0xE1
.db 0xFD ,0x19, 0xF9 ,0xCE
.db 0xFC ,0xB5, 0x03 ,0x4F
.db 0x06 ,0xFE, 0x03 ,0xAE
.db 0xFC ,0x4F, 0xF8 ,0x46
.db 0xFB ,0xF9, 0x04 ,0x09
.db 0x08 ,0x5F, 0x04 ,0x53
.db 0xFB ,0xAC, 0xF7 ,0x1B
.db   0xFB ,0x72, 0x04 ,0x8F
.db 0x09 ,0x49, 0x04 ,0xB7
.db 0xFB ,0x49, 0xF6 ,0x79
.db 0xFB ,0x35, 0x04 ,0xCC
.db 0x09 ,0x9C, 0x04 ,0xCC
.db  0xFB ,0x35, 0xF6 ,0x79
.db 0xFB ,0x49, 0x04 ,0xB7
.db 0x09 ,0x49, 0x04 ,0x8F
.db 0xFB ,0x72, 0xF7 ,0x1B
.db 0xFB ,0xAC, 0x04 ,0x53
.db 0x08 ,0x5F, 0x04 ,0x09
.db 0xFB ,0xF9, 0xF8 ,0x46
.db 0xFC ,0x4F, 0x03 ,0xAE
.db 0x06 ,0xFE, 0x03 ,0x4F
.db 0xFC ,0xB5, 0xF9 ,0xCE
.db 0xFD ,0x19, 0x02 ,0xE1
.db 0x05 ,0x5C, 0x02 ,0x7C
.db 0xFD ,0x8B, 0xFB ,0x7A
.db 0xFD ,0xEE, 0x02 ,0x0A
.db 0x03 ,0xB5, 0x01 ,0xAD
.db 0xFE ,0x5B, 0xFD ,0x0D
.db 0xFE ,0xB0, 0x01 ,0x48
.db 0x02 ,0x45, 0x00 ,0xFF
.db 0xFF ,0x08, 0xFE ,0x4E
.db 0xFF ,0x44, 0x00 ,0xB7
.db 0x01 ,0x3D, 0x00 ,0x89
.db 0xFF ,0x79, 0xFF ,0x15
.db 0xFF ,0x98, 0x00 ,0x69
.db 0x00 ,0xBE, 0x00 ,0x58
.db 0xFF ,0xA2
;

yamen- 02-20-2007
there is a problem with including square.asm this file didn`t exist.

Forumer™ is Voted #1 Free Forum Hosting provider
Build your own community today with the largest message board hosting company.