mirror of
https://github.com/sle118/squeezelite-esp32.git
synced 2025-12-15 16:07:05 +03:00
big merge
This commit is contained in:
87
components/spotify/cspot/bell/src/asm/biquad_f32_ae32.S
Normal file
87
components/spotify/cspot/bell/src/asm/biquad_f32_ae32.S
Normal file
@@ -0,0 +1,87 @@
|
||||
// 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 "esp_platform.h"
|
||||
|
||||
// This is bi quad filter form II for ESP32 processor.
|
||||
.text
|
||||
.align 4
|
||||
.global dsps_biquad_f32_ae32
|
||||
.type dsps_biquad_f32_ae32,@function
|
||||
// The function implements the following C code:
|
||||
//esp_err_t dsps_biquad_f32_ae32(const float* input, float* output, int len, float* coef, float* w)
|
||||
// {
|
||||
// for (int i=0 ; i< len ; i++)
|
||||
// {
|
||||
// float d0 = input[i] - coef[3]*w[0] - coef[4]*w[1]; (input[i] - a[1]*w[0] - a[2]*w[1];)
|
||||
// output[i] = coef[0]*d0 + coef[1]*w[0] + coef[2]*w[1];
|
||||
// w[1] = w[0];
|
||||
// w[0] = d0;
|
||||
// }
|
||||
// return ESP_OK;
|
||||
// }
|
||||
|
||||
dsps_biquad_f32_ae32:
|
||||
// input - a2
|
||||
// output - a3
|
||||
// len - a4
|
||||
// coeffs - a5
|
||||
// w- a6
|
||||
|
||||
// f0 - b0
|
||||
// f1 - b1
|
||||
// f2 - b2
|
||||
// f3 - a1
|
||||
// f4 - a2
|
||||
|
||||
// f5 - w0
|
||||
// f6 - w1
|
||||
|
||||
entry a1, 16
|
||||
// Array increment for floating point data should be 4
|
||||
lsi f0, a5, 0
|
||||
lsi f1, a5, 4
|
||||
lsi f2, a5, 8
|
||||
lsi f3, a5, 12
|
||||
lsi f4, a5, 16
|
||||
|
||||
|
||||
neg.s f5, f3 // -a[1]
|
||||
neg.s f6, f4 // -a[2]
|
||||
|
||||
lsi f7, a6, 0 // w[0]
|
||||
lsi f8, a6, 4 // w[1]
|
||||
|
||||
addi a3, a3, -4 // i-- // preset a3
|
||||
lsi f9, a2, 0 // f9 = x[i]
|
||||
loopnez a4, loop_bq_end_m_ae32
|
||||
madd.s f9, f7, f5 // f9 += -a1*w0
|
||||
addi a3, a3, 4 // out++;
|
||||
mul.s f10, f1, f7 // f10 = b1*w0
|
||||
madd.s f9, f8, f6 // f9 += -a2*w1
|
||||
madd.s f10, f9, f0 // f10 += b0*d0
|
||||
addi a2, a2, 4 // in++;
|
||||
madd.s f10, f2, f8 // f10+= b2*w1, f10 - result
|
||||
mov.s f8, f7 // w1 = w0
|
||||
mov.s f7, f9 // w0 = d0
|
||||
lsi f9, a2, 0 // f9 = x[i]
|
||||
ssi f10, a3, 0 // y[i] = result
|
||||
loop_bq_end_m_ae32:
|
||||
// Store delay line
|
||||
ssi f7, a6, 0
|
||||
ssi f8, a6, 4
|
||||
|
||||
movi.n a2, 0 // return status ESP_OK
|
||||
retw.n
|
||||
|
||||
Reference in New Issue
Block a user