filtersignalsbutterworth

Using the flts function in Scilab


I'm working with signal processing in Scilab. A low pass Butterworth filter was chosen to be applied to experimental data. First, I've created a test signal and the butterworth filter just works fine. But, when I've tried to do the same steps to the experimental data an error has occurred.

The function flts shows a message which says "flts: Arguments #1 and #2: Incompatible sizes.". How can I debug this?

I've had already tried the system function and did not work. The z variable receives the experimental data. There are some comments in Portuguese (sorry).

Here are the Scilab code:

//artificial signal for the butterworth filter
//
//clear all 
    clear
//
//Data
//
//acceleration data (z)
    z=[];
//
//
//Sampling frequency (Hz);
    wap=428;
//
//Signal frequency (Hz)
    //fs=6; 
//
//Noise frequency (Hz)
    fn=10;
//
//Cut off frequecy (fcut)
    fcut=fn/wap;
//
//Butteworth filter order (k)
    k=2;
//
//Time unit=2^n (unidTempo)
    n=9;
    unidTempo=2^n; 
//
//Time length (tempoMaximo)
    tempoMaximo=(1/wap)*unidTempo; 
//time
    tt=0:(1/wap):((unidTempo-1)*(1/wap)); 
    t=tt';
//
//
//Extract data length from z equals to 2^n

    sn=z(1:unidTempo,1);
//
//
//
//
///////////////////////////////////// FAST FOURIER TRANSFORM - FFT ////////////////////////////////////////////////////////////////////////////////////////////
//Total time and lenght of the sample
    ttotal=t($);
    N=length(sn);
//
    //Tempo para cada amostra (tamostra)
    tamostra=ttotal/N;
//
    //Taxa de aquisição (T)
    T=1/tamostra;
//
//Determinar 2^n, onde n deve ser menor ou igual a Nrdt1
    //n= ;
    _2n=N;
//
//FFT
    FFT=fft(sn);
//
//Para determinar a frequência é necessário realizar N-1. Neste caso, cria-se um vetor de uma linha e depois transforma-o em colunna. Deve-se incluir a
//variável (Nfft=1:1:___), onde o último espaço deve ser igual ao número de registros de aceleração.Assim:
    Nfft=1:1:N;
//
//A transformação da linha em coluna é:
    Nfft_t=Nfft';
//
//O N-1 sempre apresenta o primeiro valor da célula igual a zero e é realizado com:
    N_1=Nfft_t-1;
//
//Dados de frequência - o primeiro valor é sempre zero:
    fft_freq=(T/N)*(N_1);
//
//Dados de magnitude
    fft_mag=(T/N)*abs(FFT);
//
//Gráfico de frequência resultante - selecionar apenas metade do gráfico
    plot(fft_freq,fft_mag);xlabel('Frequência (Hz)');ylabel('Magnitude (dB)');title('Frequência x Magnitude');
//
//
//
//
//
//
///////////////////////////////////////////////////////////////////////////Filtro Butterworth from iir function//
    hz=iir(k,'lp','butt',[fcut 0],[])
//Change from transfer function to linear system
    sl= tf2ss(hz)
//
//Filter the signal
    fs=flts(sn,sl); 

Solution

  • The input parameter to flts must be of size 1xn in your case (sl has one input), so change the last line to

    fs=flts(sn',sl); 
    

    or make sure that input vector is always a row vector.