/** * Upsample by a factor 4. Note: very low quality, only use with output sampling rates above 96 * kHz. * * @param S State vector [ 2 ]. * @param S_offset offset of valid data. * @param out Output signal [ 4 * len ]. * @param out_offset offset of valid data. * @param in Input signal [ len ]. * @param in_offset offset of valid data. * @param len Number of INPUT samples. */ static void SKP_Silk_resampler_private_up4( int[] S, /* I/O: State vector [ 2 ] */ int S_offset, short[] out, /* O: Output signal [ 4 * len ] */ int out_offset, short[] in, /* I: Input signal [ len ] */ int in_offset, int len /* I: Number of INPUT samples */) { int k; int in32, out32, Y, X; int out16; assert (ResamplerRom.SKP_Silk_resampler_up2_lq_0 > 0); assert (ResamplerRom.SKP_Silk_resampler_up2_lq_1 < 0); /* Internal variables and state are in Q10 format */ for (k = 0; k < len; k++) { /* Convert to Q10 */ in32 = in[in_offset + k] << 10; /* All-pass section for even output sample */ Y = in32 - S[S_offset + 0]; X = SKP_SMULWB(Y, ResamplerRom.SKP_Silk_resampler_up2_lq_0); out32 = S[S_offset + 0] + X; S[S_offset + 0] = in32 + X; /* Convert back to int16 and store to output */ out16 = (short) SigProcFIX.SKP_SAT16(SigProcFIX.SKP_RSHIFT_ROUND(out32, 10)); out[out_offset + 4 * k] = (short) out16; out[out_offset + 4 * k + 1] = (short) out16; /* All-pass section for odd output sample */ Y = in32 - S[S_offset + 1]; X = SKP_SMLAWB(Y, Y, ResamplerRom.SKP_Silk_resampler_up2_lq_1); out32 = S[S_offset + 1] + X; S[S_offset + 1] = in32 + X; /* Convert back to int16 and store to output */ out16 = (short) SigProcFIX.SKP_SAT16(SigProcFIX.SKP_RSHIFT_ROUND(out32, 10)); out[out_offset + 4 * k + 2] = (short) out16; out[out_offset + 4 * k + 3] = (short) out16; } }
/** * Downsample by a factor 4. Note: very low quality, only use with input sampling rates above 96 * kHz. * * @param S State vector [ 2 ]. * @param S_offset offset of valid data. * @param out Output signal [ floor(len/2) ]. * @param out_offset offset of valid data. * @param in Input signal [ len ]. * @param in_offset offset of valid data. * @param inLen Number of input samples. */ static void SKP_Silk_resampler_private_down4( int[] S, /* I/O: State vector [ 2 ] */ int S_offset, short[] out, /* O: Output signal [ floor(len/2) ] */ int out_offset, short[] in, /* I: Input signal [ len ] */ int in_offset, int inLen /* I: Number of input samples */) { int k, len4 = inLen >> 2; int in32, out32, Y, X; assert (ResamplerRom.SKP_Silk_resampler_down2_0 > 0); assert (ResamplerRom.SKP_Silk_resampler_down2_1 < 0); /* Internal variables and state are in Q10 format */ for (k = 0; k < len4; k++) { /* Add two input samples and convert to Q10 */ in32 = (in[in_offset + 4 * k] + in[in_offset + 4 * k + 1]) << 9; /* All-pass section for even input sample */ Y = in32 - S[S_offset]; X = SKP_SMLAWB(Y, Y, ResamplerRom.SKP_Silk_resampler_down2_1); out32 = S[S_offset] + X; S[S_offset] = in32 + X; /* Add two input samples and convert to Q10 */ in32 = (in[in_offset + 4 * k + 2] + in[in_offset + 4 * k + 3]) << 9; /* All-pass section for odd input sample */ Y = in32 - S[S_offset + 1]; X = SKP_SMULWB(Y, ResamplerRom.SKP_Silk_resampler_down2_0); out32 = out32 + S[S_offset + 1]; out32 = out32 + X; S[S_offset + 1] = in32 + X; /* Add, convert back to int16 and store to output */ out[out_offset + k] = (short) SigProcFIX.SKP_SAT16(SigProcFIX.SKP_RSHIFT_ROUND(out32, 11)); } }