filtro FIR en dsPIC con biblioteca DSP

1

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 ?

    
pregunta user25707

0 respuestas

Lea otras preguntas en las etiquetas