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);
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.