Comments (3)
Hello, the problem here is data format. In the esp-dsp repository, all the _s16_
functions use Q15 fixed point data format. In your code, you are feeding the function with incorrect inputs, which causes an output overflow, and this is the reason why you are getting -1
output for your input.
Peter
from esp-dsp.
@peter-marcisovsky Wouldn't be the case to implement the shift parameter as it is implemented for dsps_add_s16?
from esp-dsp.
@peter-marcisovsky Thank you for your time, and I'm sorry to continue to bother you. I took a look at both ANSI and ae32 implementations, and simply just removing the shift instruction solved the problem. It would be very helpful if the shift parameter could be implemented.
For those who are facing the same issue. I'm talking about lines 41 and 24 of the ae32 and ANSI implementation, respectively. I'm appending here the custom implementations that solve the problem for me.
#include "dsps_mulc_platform.h"
#if (dsps_mulc_s16_ae32_enabled == 1)
.text
.align 4
.global dsps_mulc_s16_ae32_custom
.type dsps_mulc_s16_ae32_custom,@function
dsps_mulc_s16_ae32_custom:
// input - a2
// output - a3
// len - a4
// C - a5
// step_in - a6
// step_out - a7
// shift - stack (a8)
entry a1, 16
l32i.n a8, a1, 16 // Load shift to the a8 register
ssr a8 // sar = a8
srli a4, a4, 1 // a4 = a4>>1
slli a6, a6, 2 // a6 - step_in<<3, because we load two inputs per loop
slli a7, a7, 1 // a7 - step_out<<2
addi a6, a6, -4;
addi a2, a2, -4;
ldinc m0, a2
loopnez a4, loop_end_mulc_f32_ae32
add.n a2, a2, a6 // input+=step_input;
mul.DA.LL m0, a5
rsr a8, acchi
rsr a9, acclo
src a8, a8, a9 // Here result in a8
s16i a8, a3, 0 // store result to the putput
// rsr a9, acclo
// s16i a9, a3, 0 // store result to the putput
add.n a3, a3, a7 // output+=step_out;
mul.DA.HL m0, a5
rsr a8, acchi
rsr a9, acclo
ldinc m0, a2 // load next data
src a10, a8, a9 // Here result in a8
s16i a10, a3, 0 // store result to the putput
// // rsr a9, acclo
// // s16i a9, a3, 0 // store result to the putput
add.n a3, a3, a7 // output+=step_out;
loop_end_mulc_f32_ae32:
movi.n a2, 0 // return status ESP_OK
retw.n
#endif // dsps_mulc_s16_ae32_enabled
esp_err_t dsps_mulc_s16_ansi_custom(const int16_t *input, int16_t *output, int len, int16_t C, int step_in, int step_out, int shift)
{
if (NULL == input) return ESP_ERR_DSP_PARAM_OUTOFRANGE;
if (NULL == output) return ESP_ERR_DSP_PARAM_OUTOFRANGE;
for (int i = 0 ; i < len ; i++) {
int32_t acc = (int32_t)input[i * step_in] * (int32_t)C;
output[i * step_out] = (int16_t)(acc>>shift);
}
return ESP_OK;
}
from esp-dsp.
Related Issues (20)
- Notable speed improvement of floating point FIR on ESP32-S3 HOT 1
- dsps_fft2r_sc16_aes3 different result from dsps_fft2r_sc16_ansi, incorrect FFT (DSP-102) HOT 7
- SOLVED: A 1½cycle/tap fp32 FIR filter of arbitrary length and decimation (DSP-101) HOT 6
- Extended Kalman Filter 计算速度 (DSP-105) HOT 4
- Feature Request: Python wrapper (DSP-109)
- ESP-IDF 5.1 Support? (DSP-110) HOT 8
- Using LyraT to sample input, IIR functions to process, then output. The dsps_biquad_gen_xxx_f32 function creates garbage coefficients, I can't validate dsps_biquad_f32 as working. (DSP-111) HOT 3
- Two environments with different actions were specified for the same target (DSP-115) HOT 4
- esp32s3 fft4real hangs if fft4r related codes are removed. (DSP-117) HOT 4
- SOLVED: TRIAC delayed-trigger compensation routine for ESP32(-S3) (DSP-119) HOT 2
- FIR Convolution algorithm error (DSP-120) HOT 4
- dsps_dotprod_f32 is slow on first call (examples/dotprod) (DSP-121) HOT 1
- Mismatch between latest repository tag and latest component manager tag (DSP-122) HOT 4
- IIR inconsistencies and documentation problems (DSP-123)
- FFT is wrong by factor 2. Violation of the Parseval–Plancherel identity (DSP-130) HOT 2
- 是否会支持esp-p4的芯片的指令 (DSP-132) HOT 2
- esp-dsp支持idf的最新master分支吗 (DSP-134) HOT 1
- 作为一个信号处理的库,是否应该包括IFFT (DSP-135)
- Compile `esp-dsp` for `IDF_TARGET=linux` (DSP-136)
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from esp-dsp.