www.pudn.com > MATLAB.rar > conv_lpc1769.m, change:2014-09-30,size:4372b


% ------------------------------------------------------------------------- 
% 
%   Archivo:        conv_lpc1769.m 
% 
%   Descripci�n:    Convoluci�n de dos Se�ales en punto Fijo 
% 
%   Par�metros:   h :Seal a convolucionar. 
%                   x: Seal a convolucionar. 
%                   WordLength : Cantidad de bits del ADC simulado 
%                   FractLength : Cantidad de bits de parte fraccionaria 
% 
%   Devuelve:       y_fp: Vector con la se�al generada en punto fijo. 
%                   yN: Cantidad de muestras de signal. 
% 
%   Autor:          ROUX, Federico G. (rouxfederico@gmail.com) 
% 
%   Profesor: Ing. BRUNO, Julian S. 
%   RT-DSP, Departamento de Ing.Electr�nica. 
%   05/2010 UTN-BA 
% ------------------------------------------------------------------------- 
 
function [yfi yN] = conv_lpc1769(h, x, T_ADC, T_KERNEL)  
 
%ModoOverFlow='Wrap';                                                       % Modo de saturaci�n Wrap-around 
ModoOverFlow='Saturate';                                                    % Modo de saturaci�n "Saturate" 
 
wlen_adc = 13; 
flen_adc = 12; 
 
wlen_kernel = 16; 
flen_kernel = 15; 
 
wLen_Prod = 32;                                                             % WL del producto 
fLen_Prod = flen_adc + flen_kernel;                                         % FL del producto 
 
wLen_Acc = wLen_Prod;                                                              % WL del acumulador 
fLen_Acc = fLen_Prod;                                                              % FL del acumulador 
 
hN = size(h, 2);                                                            % Calculo el largo de h 
xN = size(x, 2);                                                            % Calculo el largo de x 
 
yN = hN + xN - 1;                                                           % Cantidad final de muestras del array de salida 
%yN = xN - hN;                                                              % Descarto las muestras de inicialización y final 
y = zeros(1, yN);                                                           % Inicializo con cero muestras 
 
 
%% Definicion y cuantificacion en el sistema numerico del LPC1769: 
                  
% Definimos la aritm�tica de la MAC 
F = fimath(     'ProductMode', 'SpecifyPrecision', ... 
                'ProductWordLength', wLen_Prod, ... 
                'ProductFractionLength', fLen_Prod, ... 
                'SumMode', 'SpecifyPrecision', ... 
                'SumWordLength', wLen_Acc, ... 
                'SumFractionLength', fLen_Acc, ... 
                'OverFlowMode', ModoOverFlow); %,... 
                %'RoundMode', 'floor'); 
 
% --------------- 
% Inicializacion de la variable para guardar el producto y el acc, son necesarias????? 
% ---------------    
         
% A partir de las señales, convierto las mismas a fp 
xfi = fi(x, T_ADC, F); 
hfi = fi(h, T_KERNEL, F);                                                    % Kernel en punto fijo 
 
 
%% Algoritmo de convolución en Punto Fijo         
     
for i = 1 : (xN - hN + 1) 
             
    Acum = 0;                                                               % Inicializo el acumulador en cero 
     
    for j = 1:hN 
                                 
        % ind_h = hN - j + 1;                                                 % indice de la se�al que convoluciona: cuenta hacia atr�s igual en todas las iteraciones. 
        ind_h = j;                                                 % indice de la se�al que convoluciona: cuenta hacia atr�s igual en todas las iteraciones. 
        ind_x = i + (j - 1);                                                % indice de la se�al a convolucinar: cuenta hacia adelante desplazada (i-1) veces 
         
        % fprintf('ind_h = %d /// ind_x = %d /// i = %d /// j = %d \n', ind_h, ind_x, i, j); 
        hp = hfi(ind_h); 
        xp = xfi(ind_x); 
        producto_fp = hfi(ind_h) * xfi(ind_x);                            % Producto 
        Acum = Acum + producto_fp;                                          % Guardo en el acumulador 
        fprintf('h[]*x[] += %s*%s = %s\n', hp.hex , xp.hex, Acum.hex); 
    end 
    yfi(i) = Acum;                                                         % Guardo el resultado en la se�al de salida 
    fprintf('y[] = %s\n\n',Acum.hex); 
end 
 
 
end