[Scilab-users] Frequency response

Tim Wescott tim at wescottdesign.com
Sun Sep 16 19:01:54 CEST 2018


I didn't answer about ZPK because I didn't know either!

It's not so much a Scilab thing as -- are you getting the signal
processing right?

On Sun, 2018-09-16 at 18:15 +0200, Claus Futtrup wrote:
> Hi Tim
> 
>  >So, this is complicated.
> 
> I admitted from the very beginning, it's probably just me that
> doesn't 
> know how to read the Scilab manual. It cannot be complicated for
> someone 
> who knows and/or understand the manual.
> 
> BTW, I also notice that nobody answered the question what ZPK means?
> ... 
> ZPK = Zagrepa Plivaci Klub ... at least the Scilab could spell out
> what 
> it stands for.
> 
> /Claus
> 
> On 15.09.2018 22:50, Tim Wescott wrote:
> > 
> > So, this is complicated.
> > 
> > First, if you have an impulse response, in the form of a vector of
> > samples, then you can turn it into a FIR filter, and you can find
> > the
> > frequency response of that with any of the available Scilab tools.
> >  I'm
> > not sure if there's a more direct way, but if you had an impulse
> > response h = [1, 1/2, 1/4, 1/8], then you can turn that into H = 1
> > +
> > 0.5*%z^(-1) + 0.25*%z^(-2) + 0.125*%z^(-3) (note that %z is a
> > built-in:
> > %z = poly(0, 'z')).  Then you can use techniques surrounding
> > repfreq to
> > get the frequency response.
> > 
> > Assign a sampling rate to it (i.e., by setting H.dt = 0.001, for a
> > 1kHz
> > sampling rate) and you can just use the Bode plot function:
> > bode(H).
> > 
> > Second, you can take your impulse response, pad it with zeros, and
> > then
> > take the FFT of it -- i.e. H = fft([h zeros(1, 252)]).  You need to
> > pad
> > it because the FFT is only exact for a periodic function in time --
> > padding it gives you an approximation of an actual impulse response
> > (and before someone jumps in and says you need to window it -- no,
> > you
> > don't, windowing is for sample vectors of continuous signals, not
> > impulse responses).  But if you don't know WHY the method is
> > approximate, you're going to have trouble correctly massaging the
> > data
> > before it's presented to the FFT, and with interpreting the
> > results.
> > 
> > On Sat, 2018-09-15 at 22:15 +0200, Claus Futtrup wrote:
> > > 
> > > Hi Samuel and Scilabers
> > > 
> > > My problem with freq and repfreq is that they require a "sys"
> > > input,
> > > which implies I need to describe a response function of some
> > > sort.
> > > For example (from the Scilab web-help):
> > > 
> > > https://help.scilab.org/docs/6.0.1/en_US/freq.html (example code)
> > > s=poly(0,'s');
> > > sys=(s+1)/(s^3-5*s+4)
> > > rep=freq(sys("num"),sys("den"),[0,0.9,1.1,2,3,10,20])
> > > 
> > > https://help.scilab.org/docs/6.0.1/en_US/repfreq.html (syntax)
> > > [ [frq,] repf]=repfreq(sys,fmin,fmax [,step])
> > > [ [frq,] repf]=repfreq(sys [,frq])
> > > [ frq,repf,splitf]=repfreq(sys,fmin,fmax [,step])
> > > [ frq,repf,splitf]=repfreq(sys [,frq])
> > > 
> > > ... So, the thing with the matlab freqz (as the example repeated
> > > below shows) is just a basic FFT with sampling, etc:
> > > 
> > > h = rand(1,64); // impulse response (Matlab source code)
> > > fs = 1000;
> > > Nfft = 128;
> > > [H,F] = freqz(h,1,Nfft,fs);
> > > semilogx(F,mag2db(abs(H))); grid on;
> > > xlabel('Frequency (Hz)'); ylabel('Magnitude (dB)');
> > > 
> > > It may very well be that I just don't understand the help page of
> > > repfreq. For example it says about sys: "A siso or simo linear
> > > dynamical system, in state space, transfer function or zpk
> > > representations, in continuous or discrete time." - al right
> > > then, it
> > > seems pretty capable, but so, what's "zpk" for example? ... my
> > > apologies for finding the Scilab help to be cryptic and the
> > > examples
> > > insufficient for me to solve my problem, hence I ask if someone
> > > can
> > > take above matlab code and make it work in Scilab.
> > > 
> > > Best regards,
> > > Claus
> > > 
> > > On 15.09.2018 00:32, Samuel Gougeon wrote:
> > > > 
> > > > Le 14/09/2018 à 20:57, Claus Futtrup a écrit :
> > > > > 
> > > > > Dear Scilabers
> > > > > I have calculated an impulse response and wish to do an FFT
> > > > > to
> > > > > achieve the frequency response. I know what to expect. In the
> > > > > matlab forum someone asked the same question and was
> > > > > recommended
> > > > > to use freqz ... I wonder what would be the equivalent
> > > > > function
> > > > > in Scilab?
> > > > > https://www.mathworks.com/matlabcentral/answers/350350-how-to
> > > > > -plo
> > > > > t-loudspeaker-frequency-response-from-its-impulse-response
> > > > > For example, to replicate the code snippet (second answer in
> > > > > above link), how to do this in Scilab?
> > > > > h = rand(1,64); // impulse response (Matlab source code)
> > > > > fs = 1000;
> > > > > Nfft = 128;
> > > > > [H,F] = freqz(h,1,Nfft,fs);
> > > >   
> > > > Did you have a look around freq() or repfreq()?
> > > > 
> > > > We have somewhat the equivalence invfreqz(H,F,m,n,W)  <=>
> > > > frfit(F*2*%pi, H, n, W) // Scilab
> > > > 
> > > > So you may look for the reciprocal of Scilab's frfit()
> > > > 
> > > > HTH
> > > > Samuel
> > > > 
> > > > 
> > > > 
> > > > _______________________________________________
> > > > users mailing list
> > > > users at lists.scilab.org
> > > > http://lists.scilab.org/mailman/listinfo/users
> > > 	Virus-free. www.avast.com
> > >   _______________________________________________
> > > users mailing list
> > > users at lists.scilab.org
> > > http://lists.scilab.org/mailman/listinfo/users
> 
> 
> ---
> This email has been checked for viruses by Avast antivirus software.
> https://www.avast.com/antivirus
> 
> _______________________________________________
> users mailing list
> users at lists.scilab.org
> http://lists.scilab.org/mailman/listinfo/users
-- 

Tim Wescott
www.wescottdesign.com
Control & Communications systems, circuit & software design.
Phone: 503.631.7815
Cell:  503.349.8432






More information about the users mailing list