[opus] opus-1.3.1 patch for ARM Cortex-M4F (single precision)
Forrest Zhang
forrest at 263.net
Mon May 27 11:58:08 UTC 2019
The patch prevents KEIL MDK compile warnings, like:
warning: #1035-d: single-precision operand implicitly converted to
double-precision
Actually ARM Cortex-M4F has only a *single precision* (float) FPU.
It's suit for all platforms.
See the comment at the begin of patch file.
Sincerely
Forrest Zhang
-------------- next part --------------
Specify the floating point constant with single precision.
The patch changes the similar line A to B.
A: if (analysis->activity<.4)
B: if (analysis->activity<.4f)
For ARM Cortex-M4F, it has only a *single precision* (float) FPU,
and Keil MDK compiler cannot recognize "-fsingle-precision-constant".
The compiler gives the following warning to the line A
warning: #1035-d: single-precision operand implicitly converted to double-precision
More details, refer to:
https://mcuoneclipse.com/2019/03/29/be-aware-floating-point-operations-on-arm-cortex-m4f/
diff -Naupr opus-1.3.1-vanilla/celt/celt_encoder.c opus-1.3.1/celt/celt_encoder.c
--- opus-1.3.1-vanilla/celt/celt_encoder.c 2018-10-17 03:52:45 +0800
+++ opus-1.3.1/celt/celt_encoder.c 2019-05-27 17:15:55 +0800
@@ -1321,7 +1321,7 @@ static int compute_vbr(const CELTMode *m
/*printf("%f %f %f %f %d %d ", st->analysis.activity, st->analysis.tonality, tf_estimate, st->stereo_saving, tot_boost, coded_bands);*/
#ifndef DISABLE_FLOAT_API
- if (analysis->valid && analysis->activity<.4)
+ if (analysis->valid && analysis->activity<.4f)
target -= (opus_int32)((coded_bins<<BITRES)*(.4f-analysis->activity));
#endif
/* Stereo savings */
@@ -1666,7 +1666,7 @@ int celt_encode_with_ec(CELTEncoder * OP
prefilter_tapset = st->tapset_decision;
pf_on = run_prefilter(st, in, prefilter_mem, CC, N, prefilter_tapset, &pitch_index, &gain1, &qg, enabled, nbAvailableBytes, &st->analysis);
- if ((gain1 > QCONST16(.4f,15) || st->prefilter_gain > QCONST16(.4f,15)) && (!st->analysis.valid || st->analysis.tonality > .3)
+ if ((gain1 > QCONST16(.4f,15) || st->prefilter_gain > QCONST16(.4f,15)) && (!st->analysis.valid || st->analysis.tonality > .3f)
&& (pitch_index > 1.26*st->prefilter_period || pitch_index < .79*st->prefilter_period))
pitch_change = 1;
if (pf_on==0)
diff -Naupr opus-1.3.1-vanilla/celt/fixed_generic.h opus-1.3.1/celt/fixed_generic.h
--- opus-1.3.1-vanilla/celt/fixed_generic.h 2018-09-26 14:49:41 +0800
+++ opus-1.3.1/celt/fixed_generic.h 2019-05-27 17:16:07 +0800
@@ -65,10 +65,10 @@
#endif
/** Compile-time conversion of float constant to 16-bit value */
-#define QCONST16(x,bits) ((opus_val16)(.5+(x)*(((opus_val32)1)<<(bits))))
+#define QCONST16(x,bits) ((opus_val16)(.5f+(x)*(((opus_val32)1)<<(bits))))
/** Compile-time conversion of float constant to 32-bit value */
-#define QCONST32(x,bits) ((opus_val32)(.5+(x)*(((opus_val32)1)<<(bits))))
+#define QCONST32(x,bits) ((opus_val32)(.5f+(x)*(((opus_val32)1)<<(bits))))
/** Negate a 16-bit value */
#define NEG16(x) (-(x))
diff -Naupr opus-1.3.1-vanilla/celt/mathops.h opus-1.3.1/celt/mathops.h
--- opus-1.3.1-vanilla/celt/mathops.h 2018-09-26 14:49:41 +0800
+++ opus-1.3.1/celt/mathops.h 2019-05-27 17:17:49 +0800
@@ -38,7 +38,7 @@
#include "entcode.h"
#include "os_support.h"
-#define PI 3.141592653f
+#define PI 3.14159265358979f
/* Multiplies two 16-bit fractional values. Bit-exactness of this macro is important */
#define FRAC_MUL16(a,b) ((16384+((opus_int32)(opus_int16)(a)*(opus_int16)(b)))>>15)
diff -Naupr opus-1.3.1-vanilla/celt/modes.c opus-1.3.1/celt/modes.c
--- opus-1.3.1-vanilla/celt/modes.c 2018-09-26 14:49:41 +0800
+++ opus-1.3.1/celt/modes.c 2019-05-27 17:18:26 +0800
@@ -71,7 +71,7 @@ static const unsigned char band_allocati
#endif /* CUSTOM_MODES_ONLY */
#ifndef M_PI
-#define M_PI 3.141592653
+#define M_PI 3.14159265358979f
#endif
#ifdef CUSTOM_MODES
diff -Naupr opus-1.3.1-vanilla/silk/SigProc_FIX.h opus-1.3.1/silk/SigProc_FIX.h
--- opus-1.3.1-vanilla/silk/SigProc_FIX.h 2018-09-26 14:49:41 +0800
+++ opus-1.3.1/silk/SigProc_FIX.h 2019-05-27 17:18:59 +0800
@@ -540,7 +540,7 @@ static OPUS_INLINE opus_int32 silk_ROR32
#define silk_max(a, b) (((a) > (b)) ? (a) : (b))
/* Macro to convert floating-point constants to fixed-point */
-#define SILK_FIX_CONST( C, Q ) ((opus_int32)((C) * ((opus_int64)1 << (Q)) + 0.5))
+#define SILK_FIX_CONST( C, Q ) ((opus_int32)((C) * ((opus_int64)1 << (Q)) + 0.5f))
/* silk_min() versions with typecast in the function call */
static OPUS_INLINE opus_int silk_min_int(opus_int a, opus_int b)
diff -Naupr opus-1.3.1-vanilla/silk/quant_LTP_gains.c opus-1.3.1/silk/quant_LTP_gains.c
--- opus-1.3.1-vanilla/silk/quant_LTP_gains.c 2018-09-26 14:49:41 +0800
+++ opus-1.3.1/silk/quant_LTP_gains.c 2019-05-27 17:18:47 +0800
@@ -79,7 +79,7 @@ void silk_quant_LTP_gains(
rate_dist_Q7 = 0;
sum_log_gain_tmp_Q7 = *sum_log_gain_Q7;
for( j = 0; j < nb_subfr; j++ ) {
- max_gain_Q7 = silk_log2lin( ( SILK_FIX_CONST( MAX_SUM_LOG_GAIN_DB / 6.0, 7 ) - sum_log_gain_tmp_Q7 )
+ max_gain_Q7 = silk_log2lin( ( SILK_FIX_CONST( MAX_SUM_LOG_GAIN_DB / 6.0f, 7 ) - sum_log_gain_tmp_Q7 )
+ SILK_FIX_CONST( 7, 7 ) ) - gain_safety;
silk_VQ_WMat_EC(
&temp_idx[ j ], /* O index of best codebook vector */
diff -Naupr opus-1.3.1-vanilla/src/analysis.c opus-1.3.1/src/analysis.c
--- opus-1.3.1-vanilla/src/analysis.c 2019-02-26 06:04:23 +0800
+++ opus-1.3.1/src/analysis.c 2019-05-27 17:19:28 +0800
@@ -45,7 +45,7 @@
#include "float_cast.h"
#ifndef M_PI
-#define M_PI 3.141592653
+#define M_PI 3.14159265358979f
#endif
#ifndef DISABLE_FLOAT_API
@@ -675,7 +675,7 @@ static void tonality_analysis(TonalityAn
tonal->logE[tonal->E_count][b] = logE[b];
if (tonal->count==0)
tonal->highE[b] = tonal->lowE[b] = logE[b];
- if (tonal->highE[b] > tonal->lowE[b] + 7.5)
+ if (tonal->highE[b] > tonal->lowE[b] + 7.5f)
{
if (tonal->highE[b] - logE[b] > logE[b] - tonal->lowE[b])
tonal->highE[b] -= .01f;
@@ -700,7 +700,7 @@ static void tonality_analysis(TonalityAn
L2 += tonal->E[i][b];
}
- stationarity = MIN16(0.99f,L1/(float)sqrt(1e-15+NB_FRAMES*L2));
+ stationarity = MIN16(0.99f,L1/(float)sqrt(1e-15f+NB_FRAMES*L2));
stationarity *= stationarity;
stationarity *= stationarity;
frame_stationarity += stationarity;
@@ -748,7 +748,7 @@ static void tonality_analysis(TonalityAn
neighbouring bands. */
float boost = MAX16(0, leakage_to[b] - band_log2[b]) +
MAX16(0, band_log2[b] - (leakage_from[b]+LEAKAGE_OFFSET));
- info->leak_boost[b] = IMIN(255, (int)floor(.5 + 64.f*boost));
+ info->leak_boost[b] = IMIN(255, (int)floor(.5f + 64.f*boost));
}
for (;b<LEAK_BANDS;b++) info->leak_boost[b] = 0;
diff -Naupr opus-1.3.1-vanilla/src/opus_encoder.c opus-1.3.1/src/opus_encoder.c
--- opus-1.3.1-vanilla/src/opus_encoder.c 2019-04-11 07:47:31 +0800
+++ opus-1.3.1/src/opus_encoder.c 2019-05-27 17:19:54 +0800
@@ -348,8 +348,8 @@ static void hp_cutoff(const opus_val16 *
opus_int32 Fc_Q19, r_Q28, r_Q22;
(void)arch;
- silk_assert( cutoff_Hz <= silk_int32_MAX / SILK_FIX_CONST( 1.5 * 3.14159 / 1000, 19 ) );
- Fc_Q19 = silk_DIV32_16( silk_SMULBB( SILK_FIX_CONST( 1.5 * 3.14159 / 1000, 19 ), cutoff_Hz ), Fs/1000 );
+ silk_assert( cutoff_Hz <= silk_int32_MAX / SILK_FIX_CONST( 1.5f * PI / 1000, 19 ) );
+ Fc_Q19 = silk_DIV32_16( silk_SMULBB( SILK_FIX_CONST( 1.5f * PI / 1000, 19 ), cutoff_Hz ), Fs/1000 );
silk_assert( Fc_Q19 > 0 && Fc_Q19 < 32768 );
r_Q28 = SILK_FIX_CONST( 1.0, 28 ) - silk_MUL( SILK_FIX_CONST( 0.92, 9 ), Fc_Q19 );
@@ -1182,7 +1182,7 @@ opus_int32 opus_encode_native(OpusEncode
prob = analysis_info.music_prob_max;
else
prob = analysis_info.music_prob_min;
- st->voice_ratio = (int)floor(.5+100*(1-prob));
+ st->voice_ratio = (int)floor(.5f+100*(1-prob));
}
analysis_bandwidth = analysis_info.bandwidth;
More information about the opus
mailing list