[Speex-dev] A technical question about the speex preprocessor.
John Ridges
jridges at masque.com
Wed Jul 22 13:49:13 PDT 2009
By my reckoning the confluent hypergoemetric functions should have the
following values:
M(-.25;1;-.5) = 1.11433
M(-.25;1;-1) = 1.21088
M(-.25;1;-1.5) = 1.29385
M(-.25;1;-2) = 1.36627
M(-.25;1;-2.5) = 1.43038
M(-.25;1;-3) = 1.48784
M(-.25;1;-3.5) = 1.53988
M(-.25;1;-4) = 1.58747
M(-.25;1;-4.5) = 1.63134
M(-.25;1;-5) = 1.67206
M(-.25;1;-5.5) = 1.71009
M(-.25;1;-6) = 1.74579
M(-.25;1;-6.5) = 1.77947
M(-.25;1;-7) = 1.81136
M(-.25;1;-7.5) = 1.84167
M(-.25;1;-8) = 1.87056
M(-.25;1;-8.5) = 1.89818
M(-.25;1;-9) = 1.92466
M(-.25;1;-9.5) = 1.95009
M(-.25;1;-10) = 1.97456
Which would give table values of:
static const float table[21] = {
0.82157f, 0.91549f, 0.99482f, 1.06298f, 1.12248f, 1.17515f, 1.22235f,
1.26511f, 1.30421f, 1.34025f, 1.37371f, 1.40495f, 1.43428f, 1.46195f,
1.48815f, 1.51305f, 1.53679f, 1.55948f, 1.58123f, 1.60212f, 1.62223f};
There is also a formula which asymptotically approaches M(a;b;-x) for
high values of x that is:
(gamma(b)/gamma(b-a))*(x^-a)
Which for M(-.25;1;-x) is sqrt(sqrt(x))*1.10326
at x=10 this gives a value of 1.96191 (vs. what I think is the true
value of 1.97456).
The reason I've gotten into all this is I'm trying to vectorize with SSE
intrinsics some of the slower loops in the preprocessor, and the
hypergeom_gain function is the only thing stopping me from removing all
the branches in the loops. I don't know how critical the accuracy of the
function is to the performance of the preprocessor, but if that
aforementioned approximation was good enough for all the values of x, it
would really speed the loops up.
Let me know what you think. I hope I'm helping out here (and not just
confusing things).
John Ridges
Jean-Marc Valin wrote:
> OK, so the problem is that the table you see does not match the definition?
> y = gamma(1.25)^2 * M(-.25;1;-x) / sqrt(x)
> Note that the table data has an interval of .5 for the x axis.
>
> How far are your results from the data in the table?
>
> Cheers,
>
> Jean-Marc
>
> Quoting John Ridges <jridges at masque.com>:
>
>
>> Thanks for the confirmation Jean-Marc. I kind of suspected from the
>> comments that it was the confluent hypergoemetric function, which I was
>> trying to evaluate using Kummer's equation, namely:
>>
>> M(a;b;x) is the sum from n=0 to infinity of (a)n*x^n / (b)n*n!
>> where (a)n = a(a+1)(a+2) ... (a+n-1)
>>
>> But when I use Kummer's equation, I don't get the values in the
>> "hypergeom_gain" table. Did you use a different solution to the
>> confluent hypergoemetric function when you created the table?
>>
>> John Ridges
>>
>>
>> Jean-Marc Valin wrote:
>>
>>> Hi John,
>>>
>>> M(;;) is the confluent hypergeometric function.
>>>
>>> Jean-Marc
>>>
>>> John Ridges a écrit :
>>>
>>>
>>>> Hi,
>>>>
>>>> I've been trying to re-create the table in the function "hypergeom_gain"
>>>> in preprocess.c, and I just simply can't get the same values. I get the
>>>> same value for the first element, so I know I'm computing gamma(1.25)^2
>>>> correctly, but I can't get the same numbers for M(-.25;1;-x), which I
>>>> assume is Kummer's function. Is it possible that the comment is out of
>>>> date and the values of Kummer's function used to make the table were
>>>> different? Any help would be greatly appreciated.
>>>>
>>>> John Ridges
>>>>
>>>>
>>>> _______________________________________________
>>>> Speex-dev mailing list
>>>> Speex-dev at xiph.org
>>>> http://lists.xiph.org/mailman/listinfo/speex-dev
>>>>
>>>>
>>>>
>>>>
>>>
>>>
>>
>>
>
>
>
>
>
More information about the Speex-dev
mailing list