help-octave
[Top][All Lists]

## Re: A tiny problem ...

 From: Kire Pudsje Subject: Re: A tiny problem ... Date: Mon, 1 May 2017 23:34:33 +0200

On Mon, May 1, 2017 at 10:03 PM, Doug Stewart wrote:

On Mon, May 1, 2017 at 3:57 PM, Dr.-Ing. Dieter Jurzitza wrote:
Dear listmembers,
I am using a peace of code as shown below:

"signalfilt" is a low pass filtered vector of 44100 complex elements, "noise"
a similar but uncorrelated one of the same size.

"rmsval" computes the rms value of an arbitrary (complex) input vector

****************** SNIPP **********************
NUMEL=5000;

atten=zeros(1,NUMEL);
b=signalfilt+noise;
b=b/rmsval(b);

for i=1:NUMEL
b=shift(b,1,2);
atten(i)=rmsval(signalfilt-b);
endfor
****************** SNAPP **********************

What I actually do here is some kind of correlation measurement I do not plan
to dive too deep into right now. The loop takes about 6s on my computer given
the dimensions of the vectors and numbers as listed above.

The shift operation is the most costly one in the loop, say about 10% longer
than the rmsval of the vector difference below.

You seem to care about performance. Like you say, you are doing a kind of correlation. Then why not actually do some math and rewrite your equation to perform a cross covariance using FFT's. You will get the modulo-N for free and perform all covariances in N*log(N) time. When performing the math, you will only be left with the square root of the cross covariance plus the auto correlation of the noise.
I am not sure as to which of the covariance functions in octave use the fft (ie have modulo-N behavior), but it is easy enough to write by hand using the fft functions yourself.