I've just read what it says about Discrete Hartley Transform in:
  
http://en.wikipedia.org/wiki/Fast_fourier_transform#FFT_algorithms_specialized_for_real_and.2For_symmetric_data
But this is such a weaselly assertion, I've a good mind to try it out,
when I get round to it.

On Wed, Jun 27, 2012 at 8:11 AM, Ian Clark <earthspo...@gmail.com> wrote:
>> Why would a Hartley transform be faster than the Fast Fourier Transform?
>
> That should be "might" not "would", because it's an off-the-cuff
> conjecture, until I've tried it. The Hartley transform works entirely
> with real numbers, avoiding the need for symmetrisation, which nearly
> doubles the size of the processed vector. It avoids the use of (o.) to
> ensure complex datatype doesn't creep in. Also multiplying a complex
> vector (by a floating scalar) takes twice as long as multiplying a
> same-length real vector ...at least it does in my rough timer tests.
>
> J wiki says the addon "math/fftw" works only for Windows, so I assumed
> FFT was not available in J for me as a Mac user. I am wrong. I see it
> uses a dylib (libfftw3.3.dylib) when loaded on my iMac, and it appears
> to work. (I have added a note to this effect to:
> http://www.jsoftware.com/jwiki/Addons/math/fftw .)
>
> I'm glad I've discovered that. I last played with FFT way back in 1974
> and was impressed then with what it could do.
>
> So my earlier thoughts about adapting Cooley-Tukey to the Hartley
> transform may be wasted effort since FFTW may outperform it anyway.
> Even with symmetrization.
>
> However, provided it runs in minutes, not hours or days, performance
> is low priority for me on this task. And I rather like the fact that
> ABC computes C first, because then I have the option of telling it the
> "true" C if I know it.
>
> Ian
>
> On Tue, Jun 26, 2012 at 8:13 AM, Bo Jacoby <bojac...@yahoo.dk> wrote:
>> Hi Ian.
>>
>>
>> I'm glad that your test was successful, albeit slow. The important 
>> optimization is to replace my slow fourier transform by a fast fourier 
>> transform. Your example has 100 items in the time series, and the real 
>> transform RT asks the fourier transform FT to perform 98 vector 
>> multiplications by a 198*198 complex matrix, (98*198*198)=3841992, which is 
>> embarassingly inefficient. The FFT will speed it up by a factor 
>> ((%2&^.)198)=26.
>>
>>
>> Another optimization is to incorporate the computation of A and B into the 
>> computation of C, rather than starting from scratch after computing C.
>>
>> The choice of index origin for C is a matter of taste.
>>
>>
>> Why would a Hartley transform be faster than the Fast Fourier Transform?
>>
>>
>> It remains to estimate the inaccuracies of A and B. It is the 
>> root-mean-square value of the noise vector X-A+B*C<#X. Note that the noise 
>> has only (#X)-2 degrees of freedom, because A and B have been estimated, so 
>> the root-mean-square is
>>
>>
>>    RMS=:(+/%#-2:)&.:*:
>>
>> - Bo
>>
>>
>>>________________________________
>>> Fra: Ian Clark <earthspo...@gmail.com>
>>>Til: Programming forum <programming@jsoftware.com>
>>>Sendt: 2:41 tirsdag den 26. juni 2012
>>>Emne: Re: [Jprogramming] Kalman filter in J?
>>>
>>>...I should add that my CC returns 1+(the value of your 'C'). This is
>>>for compatibility with how I generate the step fn, using (the
>>>constant) C.
>>>
>>>On Tue, Jun 26, 2012 at 1:37 AM, Ian Clark <earthspo...@gmail.com> wrote:
>>>> @Bo -Here is your solution running in my test rig...
>>>>
>>>> A= 100  bias constant (popn mean of X before the step)
>>>> B= 20   scaling factor for height of step
>>>> C= 90   epoch of actual occurrence of the Heaviside step
>>>> D= 10   scaling factor for Gaussian noise component (sigma)
>>>> N= 100  number of epochs in time series X
>>>> step detected at: (wait...)
>>>> 90
>>>>   ABC X
>>>> 99.8246 20.0353 90
>>>>
>>>> ABC takes approx 10 s to run on my iMac.
>>>> CC (--your 'C') takes approx 5 s.
>>>>
>>>> I'm actually quite impressed with how accurately it estimates A, B, C,
>>>> compared with other methods (which don't do A or B). I'm writing up my
>>>> experiments and will post a wiki link.
>>>>
>>>> Whilst I like your symmetrisation idea, might instead using the
>>>> discrete Hartley Transform (which works entirely in the real domain)
>>>> speed things up?
>>>>
>>>> Ian
>>>>
>>>> On Mon, Jun 25, 2012 at 12:00 PM, Bo Jacoby <bojac...@yahoo.dk> wrote:
>>>>> Hi Ian. Here is your solution.
>>>>>
>>>>>    ABC=: 3 : 0
>>>>>       c=.C y
>>>>>       y=.(0,>:c){RT"1&(,H&#)y
>>>>>       y=.y,(%/1{"1 y)*1{y
>>>>>       y=.y,(0{y)-2{y
>>>>>       y=.y,(#|:y){.{.{:y
>>>>>       y=.4 2{{:"1 RT"1 y
>>>>>       y,c
>>>>> )
>>>>>    ABC 101 103 100 210 230 200
>>>>> 101.15 115.101 2
>>>>>
>>>>>
>>>>> - Bo
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>>________________________________
>>>>>> Fra: Ian Clark <earthspo...@gmail.com>
>>>>>>Til: Programming forum <programming@jsoftware.com>
>>>>>>Sendt: 6:46 mandag den 25. juni 2012
>>>>>>Emne: Re: [Jprogramming] Kalman filter in J?
>>>>>>
>>>>>>Interesting approach, Bo.
>>>>>>
>>>>>>Turned my attention to CUSUM (an adaptive filter) which is rather easy
>>>>>>to compute and gives good results, but needs parameters setting "by
>>>>>>eye". I've yet to try a Bayesian approach, which I suspect will be the
>>>>>>most sensitive of all.
>>>>>>
>>>>>>But I did play with your FT, using *:@(10&o.) to plot a power
>>>>>>spectrum. I'm using rather noisier data than your example: my step is
>>>>>>only roughly (sigma) high. Nevertheless with the onset of the step I
>>>>>>can clearly see a high-frequency spike appear at the far end of the
>>>>>>transformed time-series, due to the transformed Heaviside fn. Same
>>>>>>problem as with the CUSUM statistic however: designing a detector
>>>>>>which can be adjusted for false negatives and positives, and doesn't
>>>>>>take too many subsequent samples to detect the step.
>>>>>>
>>>>>>Will try out your C function in my context, and try to tweak it. Your
>>>>>>solution detects when the step happens, solving 1 in my stated
>>>>>>objectives: 1-4. I fear however that I am more interested in 2-4.
>>>>>>
>>>>>>
>>>>>>
>>>>>>On Sun, Jun 24, 2012 at 6:06 PM, Bo Jacoby <bojac...@yahoo.dk> wrote:
>>>>>>> Hi Ian
>>>>>>> The Fourier Transform FT transforms a complex n-vector X into a complex 
>>>>>>> n-vector Y.If X is real, then Y is symmetric. And if X is symmetric 
>>>>>>> then Y is real. So I think it is a good idea to symmetrize X before 
>>>>>>> taking the FT. (This makes a slow program even slower. Optimize later!)
>>>>>>>
>>>>>>>
>>>>>>> NB.sm=: symmetrize
>>>>>>>    sm=:[:,}:"1&(,:|.)
>>>>>>>    sm i.6 NB. see what I mean
>>>>>>>
>>>>>>> 0 1 2 3 4 5 4 3 2 1
>>>>>>> NB.RT=: Real Transform. (9 o. removes every trace of complexity)
>>>>>>>    RT=:9 o.#{.FT&sm
>>>>>>> NB.H=:Heaviside steps
>>>>>>>    H=:i.&<:</i.
>>>>>>>
>>>>>>> NB.C=:Index of the last item before the change
>>>>>>>    C=:[:(i.<./)[:+/"1[:*:[:}.[:(-"1{.)[:}."1[:(%{."1)[:}."1[:RT"1],[:H#
>>>>>>> NB.test
>>>>>>>    C 101 204 202 200 203
>>>>>>> 0
>>>>>>>    C 101 104 202 200 203
>>>>>>> 1
>>>>>>>    C 101 104 102 200 203
>>>>>>> 2
>>>>>>>    C 101 104 102 100 203
>>>>>>> 3
>>>>>>>
>>>>>>> This is not a Kálmán filter, but it solves the problem.
>>>>>>> - Bo
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>>________________________________
>>>>>>>> Fra: Ian Clark <earthspo...@gmail.com>
>>>>>>>>Til: Programming forum <programming@jsoftware.com>
>>>>>>>>Sendt: 3:20 fredag den 22. juni 2012
>>>>>>>>Emne: Re: [Jprogramming] Kalman filter in J?
>>>>>>>>
>>>>>>>>Thanks, Bo. I'll look at it when I get back, probably over the weekend.
>>>>>>>>
>>>>>>>>Ian
>>>>>>>>
>>>>>>>>On Fri, Jun 22, 2012 at 12:44 AM, Bo Jacoby <bojac...@yahoo.dk> wrote:
>>>>>>>>> Hi Ian.
>>>>>>>>> The following is a tool, but not yet a solution.
>>>>>>>>>
>>>>>>>>> FT is a slow Fourier Transform. When the problem has been solved it 
>>>>>>>>> is time to optimize. This FT has the nice property that FT^:_1 is 
>>>>>>>>> identical to FT.
>>>>>>>>>
>>>>>>>>> NB.FT =: Fourier Transformation
>>>>>>>>>    FT =: +/&(+*((%:%~_1&^&+:&(%~(*/])&i.))&#))
>>>>>>>>> NB.rd =: round complex number.
>>>>>>>>>    rd =: (**|)&.+.
>>>>>>>>> NB.H  =: Heaviside step function
>>>>>>>>>    H  =: (]#0:),-#1:
>>>>>>>>>    10 H 3
>>>>>>>>> 0 0 0 1 1 1 1 1 1 1
>>>>>>>>>    NB. FT = FT^:_1
>>>>>>>>>    rd FT FT 10 H 3
>>>>>>>>> 0 0 0 1 1 1 1 1 1 1
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> NB. For fixed C the values of A and B to minimize +/*:X-A+B*(#X)H C 
>>>>>>>>> are found by solving (2{.FT X) = 2{.FT A+B*(#X)H C
>>>>>>>>>
>>>>>>>>> - Bo
>>>>>>>>>>________________________________
>>>>>>>>>> Fra: Ian Clark <earthspo...@gmail.com>
>>>>>>>>>>Til: Programming forum <programming@jsoftware.com>
>>>>>>>>>>Sendt: 18:15 torsdag den 21. juni 2012
>>>>>>>>>>Emne: Re: [Jprogramming] Kalman filter in J?
>>>>>>>>>>
>>>>>>>>>>Yes, Bo, that looks like a fair statement of the problem, in terms of
>>>>>>>>>>least-squares minimization.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>On Thu, Jun 21, 2012 at 4:46 PM, Bo Jacoby <bojac...@yahoo.dk> wrote:
>>>>>>>>>>> Consider the step functions
>>>>>>>>>>>
>>>>>>>>>>>    H=:(]#0:),-#1:
>>>>>>>>>>>    10 H 0
>>>>>>>>>>> 1 1 1 1 1 1 1 1 1 1
>>>>>>>>>>>    10 H 3
>>>>>>>>>>> 0 0 0 1 1 1 1 1 1 1
>>>>>>>>>>>    10 H 10
>>>>>>>>>>> 0 0 0 0 0 0 0 0 0 0
>>>>>>>>>>> The problem is to find constants A,B,C to minimize the expression
>>>>>>>>>>>
>>>>>>>>>>>    +/*:X-A+B*(#X)H C
>>>>>>>>>>> Right?
>>>>>>>>>>> -Bo
>>>>>>>>>>>>________________________________
>>>>>>>>>>>> Fra: Ian Clark <earthspo...@gmail.com>
>>>>>>>>>>>>Til: Programming forum <programming@jsoftware.com>
>>>>>>>>>>>>Sendt: 14:34 torsdag den 21. juni 2012
>>>>>>>>>>>>Emne: Re: [Jprogramming] Kalman filter in J?
>>>>>>>>>>>>
>>>>>>>>>>>>Thanks, Bo and Ric. Yes, I'd tried searching jwiki on "Kalman" and
>>>>>>>>>>>>Pieter's page was the only instance.
>>>>>>>>>>>>
>>>>>>>>>>>>I neglected to mention that in the most general case I can't really 
>>>>>>>>>>>>be
>>>>>>>>>>>>confident that X1 and X2 have the same distribution function, let
>>>>>>>>>>>>alone the same variance. But looking at it again, I see that under 
>>>>>>>>>>>>the
>>>>>>>>>>>>restrictions I've placed the problem simplifies immensely to 
>>>>>>>>>>>>fitting a
>>>>>>>>>>>>step-function H to: X=: K+G+H. If I can just do that, I'll be happy
>>>>>>>>>>>>for now.
>>>>>>>>>>>>
>>>>>>>>>>>>Repeated application of FFT should allow me to subtract the noise
>>>>>>>>>>>>spectrum F(G), or at least see a significant change in the overall
>>>>>>>>>>>>spectrum emerge after point T, and that might handle the more 
>>>>>>>>>>>>general
>>>>>>>>>>>>cases as well.
>>>>>>>>>>>>
>>>>>>>>>>>>Anyway it's simple-minded enough for me, and worth a try. FFT is,
>>>>>>>>>>>>after all, "fast" :-)
>>>>>>>>>>>>
>>>>>>>>>>>>But won't an even faster transform do the trick, such as (+/X)? On 
>>>>>>>>>>>>the
>>>>>>>>>>>>above model, X performs a drunkard's walk around a value M1 until 
>>>>>>>>>>>>some
>>>>>>>>>>>>point T, after which it walks around M2. Solution: simply estimate 
>>>>>>>>>>>>M1
>>>>>>>>>>>>and M2 on an ongoing basis.
>>>>>>>>>>>>
>>>>>>>>>>>>I get the feeling I ought to be searching on terms like "edge
>>>>>>>>>>>>detection", "step detection" and CUSUM.
>>>>>>>>>>>>
>>>>>>>>>>>>Anyway, there's enough here to try.
>>>>>>>>>>>>
>>>>>>>>>>>>On Thu, Jun 21, 2012 at 10:28 AM, Ric Sherlock <tikk...@gmail.com> 
>>>>>>>>>>>>wrote:
>>>>>>>>>>>>> Hi Ian,
>>>>>>>>>>>>>
>>>>>>>>>>>>> A quick search of the J wiki finds this:
>>>>>>>>>>>>> http://www.jsoftware.com/jwiki/Stories/PietdeJong
>>>>>>>>>>>>> Sounds like he might have what you're after?
>>>>>>>>>>>>>
>>>>>>>>>>>>> Cheers,
>>>>>>>>>>>>> Ric
>>>>>>>>>>>>>
>>>>>>>>>>>>> On Thu, Jun 21, 2012 at 4:33 PM, Ian Clark 
>>>>>>>>>>>>> <earthspo...@gmail.com> wrote:
>>>>>>>>>>>>>> Can anyone help? Has anyone written a Kalman filter in J?
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> I'm not a specialist in either statistics or control theory, so 
>>>>>>>>>>>>>> I'm
>>>>>>>>>>>>>> only guessing a Kalman filter is what I need. Though I do have a
>>>>>>>>>>>>>> passing acquaintance with the terms: stochastic control and 
>>>>>>>>>>>>>> linear
>>>>>>>>>>>>>> quadratic Gaussian (LQG) control. I am aware that a "Kalman 
>>>>>>>>>>>>>> filter"
>>>>>>>>>>>>>> (like ANOVA) is more a topic than a black-box.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> So let me explain what I want it for.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> I have a time series X which I am assuming can be modelled like 
>>>>>>>>>>>>>> this:
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> X=: K + G + (X1,X2)
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> where
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> K is constant
>>>>>>>>>>>>>> G is Gaussian noise
>>>>>>>>>>>>>> X1 is a random variable with mean: M1 and variance: V1
>>>>>>>>>>>>>> X2 is a random variable with mean: M2 and variance: V2
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Typically X is a sequence of sensor readings, but may also be
>>>>>>>>>>>>>> measurements from a series of user trials conducted on a working
>>>>>>>>>>>>>> prototype, which suffers a design-change at a given point T.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Simplifying assumptions (which unfortunately I may need to relax 
>>>>>>>>>>>>>> in due course):
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> (a) X is not multivariate
>>>>>>>>>>>>>> (b) X1 and X2 are Gaussian
>>>>>>>>>>>>>> (c) V1=V2 (only the mean value changes, not the variance).
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> The problem:
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> 1. Estimate T=: 1+#X1 -- the point at which X1 gives way to X2.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> 2. Given T, estimate (M2-M1) -- the "underlying improvement", if 
>>>>>>>>>>>>>> any,
>>>>>>>>>>>>>> of the change to the prototype.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> 3. (subcase of 2.) Given T, test the null hypothesis: M1=M2, viz 
>>>>>>>>>>>>>> that
>>>>>>>>>>>>>> there has been no underlying improvement.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> 4. Estimate U=: #X2 -- the minimum number of samples needed 
>>>>>>>>>>>>>> after T in
>>>>>>>>>>>>>> order to achieve 1-3 above with 95% confidence.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> In other words, detect the signal-in-noise: M1-->M2, and do so 
>>>>>>>>>>>>>> in real-time.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Because of 4, the need to estimate T and (M2-M1) on an ongoing 
>>>>>>>>>>>>>> basis,
>>>>>>>>>>>>>> I can't do a randomised block design. I gather that a Kalman 
>>>>>>>>>>>>>> filter,
>>>>>>>>>>>>>> or some sort of adaptive filter, will handle this problem.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> But maybe something simpler will turn out good enough?
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Supposing I can get hold of a "black box" Kalman filter, I 
>>>>>>>>>>>>>> propose to
>>>>>>>>>>>>>> test it out on generated data and compare its performance to some
>>>>>>>>>>>>>> simple-minded approach, like estimating M1 / M2 from a simple 
>>>>>>>>>>>>>> moving
>>>>>>>>>>>>>> average of the last U samples, or applying the F-test to 2 sets 
>>>>>>>>>>>>>> of U
>>>>>>>>>>>>>> samples taken either side of T.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> But since the technique aims to be published, or at least 
>>>>>>>>>>>>>> critically
>>>>>>>>>>>>>> scrutinised (and maybe incorporated in a software product), I'd 
>>>>>>>>>>>>>> rather
>>>>>>>>>>>>>> depend on a state-of-art packaged solution than reinvent the 
>>>>>>>>>>>>>> wheel: a
>>>>>>>>>>>>>> large and very well-turned wheel it appears to me.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Ian Clark
>>>>>>>>>>>>>> ----------------------------------------------------------------------
>>>>>>>>>>>>>> For information about J forums see 
>>>>>>>>>>>>>> http://www.jsoftware.com/forums.htm
>>>>>>>>>>>>----------------------------------------------------------------------
>>>>>>>>>>>>For information about J forums see 
>>>>>>>>>>>>http://www.jsoftware.com/forums.htm
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>> ----------------------------------------------------------------------
>>>>>>>>>>> For information about J forums see 
>>>>>>>>>>> http://www.jsoftware.com/forums.htm
>>>>>>>>>>----------------------------------------------------------------------
>>>>>>>>>>For information about J forums see http://www.jsoftware.com/forums.htm
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>> ----------------------------------------------------------------------
>>>>>>>>> For information about J forums see http://www.jsoftware.com/forums.htm
>>>>>>>>----------------------------------------------------------------------
>>>>>>>>For information about J forums see http://www.jsoftware.com/forums.htm
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>> ----------------------------------------------------------------------
>>>>>>> For information about J forums see http://www.jsoftware.com/forums.htm
>>>>>>----------------------------------------------------------------------
>>>>>>For information about J forums see http://www.jsoftware.com/forums.htm
>>>>>>
>>>>>>
>>>>>>
>>>>> ----------------------------------------------------------------------
>>>>> For information about J forums see http://www.jsoftware.com/forums.htm
>>>----------------------------------------------------------------------
>>>For information about J forums see http://www.jsoftware.com/forums.htm
>>>
>>>
>>>
>> ----------------------------------------------------------------------
>> For information about J forums see http://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to