mirror of
https://github.com/rtlsdrblog/rtl-sdr-blog.git
synced 2025-01-13 03:37:17 +01:00
rtl_fm: crude integer atan2, around 40% faster
Signed-off-by: Steve Markgraf <steve@steve-m.de>
This commit is contained in:
parent
6e80117205
commit
62cc815863
27
src/rtl_fm.c
27
src/rtl_fm.c
@ -182,13 +182,36 @@ void multiply(int ar, int aj, int br, int bj, int *cr, int *cj)
|
|||||||
*cj = aj*br + ar*bj;
|
*cj = aj*br + ar*bj;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int fast_atan2(int y, int x)
|
||||||
|
/* pre scaled for int16 */
|
||||||
|
{
|
||||||
|
int yabs, angle, pi4=(1<<12); // note pi = 1<<14
|
||||||
|
if (x==0 && y==0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
yabs = y;
|
||||||
|
if (yabs < 0) {
|
||||||
|
yabs = -yabs;
|
||||||
|
}
|
||||||
|
if (x >= 0) {
|
||||||
|
angle = pi4 - pi4 * (x-yabs) / (x+yabs);
|
||||||
|
} else {
|
||||||
|
angle = 3*pi4 - pi4 * (x+yabs) / (yabs-x);
|
||||||
|
}
|
||||||
|
if (y < 0) {
|
||||||
|
return -angle;
|
||||||
|
}
|
||||||
|
return angle;
|
||||||
|
}
|
||||||
|
|
||||||
int polar_discriminant(int ar, int aj, int br, int bj)
|
int polar_discriminant(int ar, int aj, int br, int bj)
|
||||||
{
|
{
|
||||||
int cr, cj;
|
int cr, cj;
|
||||||
double angle;
|
double angle;
|
||||||
multiply(ar, aj, br, -bj, &cr, &cj);
|
multiply(ar, aj, br, -bj, &cr, &cj);
|
||||||
angle = atan2((double)cj, (double)cr);
|
//angle = atan2((double)cj, (double)cr);
|
||||||
return (int)(angle / 3.14159 * (1<<14));
|
//return (int)(angle / 3.14159 * (1<<14));
|
||||||
|
return fast_atan2(cj, cr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void fm_demod(struct fm_state *fm)
|
void fm_demod(struct fm_state *fm)
|
||||||
|
Loading…
Reference in New Issue
Block a user