Tengo que hacer un filtro digital con un dsPIC30F, pero no sé mucho al respecto. He leído parte de la documentación sobre el dsPIC30F y la biblioteca DSP, y encontré una página en el sitio web de Microchip donde encontré algunos códigos de ejemplo para dsPICs. Necesito hacer un filtro digital y encontré un código que implementa un filtro FIR con la biblioteca DSP. El código donde definen la variable FIRStruct
es el siguiente:
; ..............................................................................
; File lowpassexample_psv.s
; ..............................................................................
.equ lowpassexample_psvNumTaps, 75
; ..............................................................................
; Allocate and initialize filter taps
; .section .lowpassexample_psvconst, "x" ;<-Syntax supported in MPLAB C30
;v1.20 and before
.section .lowpassexample_psvconst, code ;<-Syntax supported in MPLAB C30
;v1.30 and later
.align 256
lowpassexample_psvTaps:
.hword 0xFFFA, 0xFFFB, 0x0000, 0x000B, 0x0017, 0x001E, 0x0017, 0x0000, 0xFFDF
.hword 0xFFBF, 0xFFB2, 0xFFC7, 0x0000, 0x004F, 0x0095, 0x00AC, 0x007A, 0x0000
.hword 0xFF61, 0xFEDA, 0xFEB2, 0xFF16, 0x0000, 0x012E, 0x022B, 0x0277, 0x01BD
.hword 0x0000, 0xFDB7, 0xFBB4, 0xFAF3, 0xFC45, 0x0000, 0x05CF, 0x0CB1, 0x1337
.hword 0x17E1, 0x1993, 0x17E1, 0x1337, 0x0CB1, 0x05CF, 0x0000, 0xFC45, 0xFAF3
.hword 0xFBB4, 0xFDB7, 0x0000, 0x01BD, 0x0277, 0x022B, 0x012E, 0x0000, 0xFF16
.hword 0xFEB2, 0xFEDA, 0xFF61, 0x0000, 0x007A, 0x00AC, 0x0095, 0x004F, 0x0000
.hword 0xFFC7, 0xFFB2, 0xFFBF, 0xFFDF, 0x0000, 0x0017, 0x001E, 0x0017, 0x000B
.hword 0x0000, 0xFFFB, 0xFFFA
; ..............................................................................
; Allocate delay line in (uninitialized) Y data space
; .section .ybss, "b" ;<-Syntax supported in MPLAB C30
;v1.20 and before
.section .ydata, data, ymemory ;<-Syntax supported in MPLAB C30
;v1.30 and later
.align 256
lowpassexample_psvDelay:
.space lowpassexample_psvNumTaps*2
; ..............................................................................
; Allocate and intialize filter structure
.section .data
.global _lowpassexample_psvFilter
_lowpassexample_psvFilter:
.hword lowpassexample_psvNumTaps
.hword psvoffset(lowpassexample_psvTaps)
.hword psvoffset(lowpassexample_psvTaps)+lowpassexample_psvNumTaps*2-1
.hword psvpage(lowpassexample_psvTaps)
.hword lowpassexample_psvDelay
.hword lowpassexample_psvDelay+lowpassexample_psvNumTaps*2-1
.hword lowpassexample_psvDelay
Tengo una duda sobre los coeficientes lowpassexample_psvTaps
. Usé WinFilter para hacer un filtro FIR y generé el código C, y estos son los coeficientes:
float FIRCoef[Ntap] = {
-0.00000058743658087605,
-0.00000170525260960957,
-0.00000009806565977364,
0.00000925056898872310,
0.00001872073503672877,
-0.00001502619952749291,
-0.00013573239910459012,
-0.00018365135507150430,
0.00042104037187822555,
0.00193257551455663080,
0.00137326885639539030,
-0.00929872209942904540,
-0.02854945035703963800,
0.00637252183193085400,
0.27686786791380363000,
0.50237945474486490000,
0.27686786791380363000,
0.00637252183193085400,
-0.02854945035703963800,
-0.00929872209942904540,
0.00137326885639539030,
0.00193257551455663080,
0.00042104037187822555,
-0.00018365135507150430,
-0.00013573239910459012,
-0.00001502619952749291,
0.00001872073503672877,
0.00000925056898872310,
-0.00000009806565977364,
-0.00000170525260960957,
-0.00000058743658087605
};
En la documentación de la biblioteca DSP dice que los coeficientes para el FIRStruct
son fractional
, y vi que una fracción puede tener valores entre -1 y 0.99999 ... La duda que tengo es la siguiente: Si quiero hacer un filtro FIR, lo único que tendría que hacer es convertir mis coeficientes a fractional
(con la operación definida en la macro
#define Q15(X) \
((X < 0.0) ? (int)(32768*(X) - 0.5) : (int)(32767*(X) + 0.5))
en el dsp.h
) y reemplázalos en el lowpassexample_psvTaps
y cambia el valor de lowpassexample_psvNumTaps
?