Files
snapclient/components/esp-dsp/modules/conv/float/dsps_conv_f32_ansi.c
Carlos 15b4baba28 - merge with original master from jorgen
- minimize RAM usage of all components
- use both IRAM and DRAM in player component so we can buffer up to 1s on modules without SPI RAM
- support fragemented pcm chunks so we can use all available RAM if there isn't a big enough block available but still enough HEAP
- reinclude all components from jorgen's master branch
- add custom i2s driver to get a precise timing of initial sync
- change wrong usage of esp_timer for latency measurement of snapcast protocol
- add player component
2021-08-19 21:57:16 +02:00

81 lines
2.3 KiB
C

// Copyright 2018-2019 Espressif Systems (Shanghai) PTE LTD
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include "dsps_conv.h"
#include "esp_log.h"
static const char *TAG = "dsps_conv";
esp_err_t dsps_conv_f32_ansi(const float *Signal, const int siglen, const float *Kernel, const int kernlen, float *convout)
{
if (NULL == Signal) {
return ESP_ERR_DSP_PARAM_OUTOFRANGE;
}
if (NULL == Kernel) {
return ESP_ERR_DSP_PARAM_OUTOFRANGE;
}
if (NULL == convout) {
return ESP_ERR_DSP_PARAM_OUTOFRANGE;
}
float *sig = (float *)Signal;
float *kern = (float *)Kernel;
int lsig = siglen;
int lkern = kernlen;
if (siglen < kernlen) {
sig = (float *)Kernel;
kern = (float *)Signal;
lsig = kernlen;
lkern = siglen;
}
for (int n = 0; n < lkern; n++) {
size_t k;
convout[n] = 0;
for (k = 0; k <= n; k++) {
convout[n] += sig[k] * kern[n - k];
}
ESP_LOGV(TAG,"L1 kmin = %i, kmax = %i , n-kmin = %i", 0, n, n);
}
for (int n = lkern; n < lsig; n++) {
size_t kmin, kmax, k;
convout[n] = 0;
kmin = n - lkern + 1;
kmax = n;
ESP_LOGV(TAG,"L2 n=%i, kmin = %i, kmax = %i , n-kmin = %i", n, kmin, kmax, n-kmin);
for (k = kmin; k <= kmax; k++) {
convout[n] += sig[k] * kern[n - k];
}
}
for (int n = lsig; n < lsig + lkern - 1; n++) {
size_t kmin, kmax, k;
convout[n] = 0;
kmin = n - lkern + 1;
kmax = lsig - 1;
for (k = kmin; k <= kmax; k++) {
convout[n] += sig[k] * kern[n - k];
}
ESP_LOGV(TAG,"L3 n=%i, kmin = %i, kmax = %i , n-kmin = %i", n, kmin, kmax, n-kmin);
}
return ESP_OK;
}