add xmos ns

This commit is contained in:
Steven Dan
2026-06-22 18:47:11 +08:00
parent 6bbf4fbe9b
commit e0c7b107ef
9 changed files with 141 additions and 97 deletions

View File

@@ -15,33 +15,35 @@
#include "debug_print.h"
unsigned g_dsp_eof = 0;
void dnr_exchange_buffer(int32_t *data) {
#if XMOS_NS_EN || DNR_50MS || DNR_11MS
static unsigned buff_index = 0;
write_to_sample_in_buf(data[1], buff_index, 0);
read_from_sample_out_buf(&data[1],buff_index, 0);
unsigned out_sample = 0;
write_to_sample_in_buf((unsigned)data[1], buff_index, 0);
read_from_sample_out_buf(&out_sample, buff_index, 0);
data[1] = (int32_t)out_sample;
data[0] = data[1];
buff_index++;
#if DNR_11MS
if (buff_index == 128)
/* 改动原因XMOS NS 块长 1024满帧后轮转 triple-buffer 并通知 tile0 处理任务。 */
if (buff_index == DNR_DSP_FRAME_SIZE)
{
#else
if (buff_index == 512)
{
#endif
buf_slot_rotate();
buff_index = 0;
SET_SHARED_GLOBAL(g_dsp_eof, 1);
}
#else
/* 改动原因:未启用 NS/DNR 时直通,保持 extra_i2s 链接符号可用。 */
data[0] = data[1];
#endif
}
void Aizip_DNR_init(void);
void dnr_dsp_proc_task(void)
{
#if DNR_50MS || DNR_11MS
Aizip_DNR_init();
#if XMOS_NS_EN || DNR_50MS || DNR_11MS
/* 改动原因:由 Aizip_DNR_init 替换为 xmos_ns_init对接 libxmos_ns.a。 */
xmos_ns_init();
while(1) {
unsigned dsp_eof = 0;
GET_SHARED_GLOBAL(dsp_eof, g_dsp_eof);

View File

@@ -13,18 +13,23 @@
#include <platform.h>
#include <string.h>
#include "dnr_dsp_buf.h"
#include "aizip_dnr.h"
#include "debug_print.h"
#if XMOS_NS_EN
#include "ns_api.h"
#elif defined(DNR_50MS) || defined(DNR_11MS)
#include "aizip_dnr.h"
#include "flash.h"
#include "swlock.h"
// Global flash lock defined in lfs_services.c — protects all flash hardware access
extern swlock_t flash_lock;
#endif
//for AGC
//static agc_stage_ctx_t DWORD_ALIGNED agc_stage_state = {};
static unsigned __attribute__((aligned (4))) dsp_dnr_frame_buf[BUF_SLOT_NUM][DSP_CH_NUM][DNR_DSP_FRAME_SIZE];
/* 改动原因XMOS NS 使用 int16 样点缓冲;原 Aizip DNR 使用 unsigned 32bit 缓冲。 */
#if XMOS_NS_EN
static int16_t __attribute__((aligned(8))) dsp_dnr_frame_buf[BUF_SLOT_NUM][DSP_CH_NUM][DNR_DSP_FRAME_SIZE];
#else
static unsigned __attribute__((aligned(4))) dsp_dnr_frame_buf[BUF_SLOT_NUM][DSP_CH_NUM][DNR_DSP_FRAME_SIZE];
#endif
unsigned sample_in_buf_slot=0;
unsigned processing_buf_slot=2;
@@ -57,13 +62,56 @@ void buf_slot_rotate()
void write_to_sample_in_buf(unsigned data, unsigned index, unsigned ch)
{
#if XMOS_NS_EN
/* 改动原因USB 24bit 样点存于 int32 高 24 位,右移 16 位得到 int16 送入 NS。 */
dsp_dnr_frame_buf[sample_in_buf_slot][ch][index] = (int16_t)((int32_t)data >> 16);
#else
dsp_dnr_frame_buf[sample_in_buf_slot][ch][index]=data;
#endif
}
void read_from_sample_out_buf(unsigned* read_data, unsigned index, unsigned ch)
{
#if XMOS_NS_EN
/* 改动原因NS 输出 int16 左移 16 位还原为 USB 32bit 样点格式。 */
*read_data = (unsigned)((int32_t)dsp_dnr_frame_buf[sample_out_buf_slot][ch][index] << 16);
#else
*read_data = dsp_dnr_frame_buf[sample_out_buf_slot][ch][index];
#endif
}
#if XMOS_NS_EN
unsigned ns_init_flag = 0;
void xmos_ns_init(void)
{
ns_xmos_xc_init();
/* 改动原因:仅启用 NS 降噪,关闭 NS 库内 EQ避免与主 EQ 引擎冲突。 */
ns_xmos_xc_set_module_enable(1, 0);
int16_t gains_zero[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
ns_xmos_xc_eq_set_all_gains(gains_zero);
ns_init_flag = 1;
debug_printf("XMOS NS init done\n");
}
void start_dsp_processing(void)
{
int16_t __attribute__((aligned(8))) ns_in[DNR_DSP_FRAME_SIZE];
int16_t __attribute__((aligned(8))) ns_out[DNR_DSP_FRAME_SIZE];
/* 改动原因:从 processing slot 取出 1024 样点单声道数据,调用 ns_xmos_xc_process 处理后写回。 */
memcpy(ns_in, &dsp_dnr_frame_buf[processing_buf_slot][0][0],
DNR_DSP_FRAME_SIZE * sizeof(int16_t));
ns_xmos_xc_process(ns_in, ns_out);
memcpy(&dsp_dnr_frame_buf[processing_buf_slot][0][0], ns_out,
DNR_DSP_FRAME_SIZE * sizeof(int16_t));
}
#elif defined(DNR_50MS) || defined(DNR_11MS)
#if DNR_11MS
int8_t buffer[4208] __attribute__((aligned(4)));
int8_t buffer2[31136] __attribute__((aligned(4)));
@@ -79,27 +127,22 @@ azp_dnr_param_t pram = {
.sample_rate = 48000};
unsigned dnr_init_flag = 0;
void Aizip_DNR_init(void)
{
#if DNR_50MS || DNR_11MS
delay_microseconks(10000);
// setFlashPortPins(XS1_PORT_1B,XS1_PORT_1C,XS1_PORT_4B, XS1_CLKBLK_3);
void xmos_ns_init(void)
{
delay_microseconds(10000);
swlock_acquire(&flash_lock);
int sta = AI_DNR_init(&pram);
swlock_release(&flash_lock);
dnr_init_flag = 1;
debug_printf("AI_DNR_init status %d\n", sta);
#endif
}
void start_dsp_processing(void)
{
#if DNR_50MS || DNR_11MS
float level = -200;
setNoisy_mix_factor(level);
AI_DNR_Processing((int32_t *)&dsp_dnr_frame_buf[processing_buf_slot][0][0]);
#endif
}
#endif

View File

@@ -10,11 +10,16 @@
#include <platform.h>
#include <xcore/chanend.h>
#include <xcore/channel.h>
#if DNR_11MS
/* 改动原因XMOS_NS_EN 时单帧 1024 样点,替代原 DNR_50MS(512)/DNR_11MS(128) 帧长。 */
#if XMOS_NS_EN
#define DNR_DSP_FRAME_SIZE 1024
#elif DNR_11MS
#define DNR_DSP_FRAME_SIZE 128
#else
#define DNR_DSP_FRAME_SIZE 512
#endif
#define BUF_SLOT_NUM 3 //one for input, one for output, one for processing
#define DSP_CH_NUM 2
@@ -30,10 +35,10 @@ void write_to_sample_in_buf(unsigned data, unsigned index, unsigned ch);
void read_from_sample_out_buf(unsigned* read_data, unsigned index, unsigned ch);
void start_dsp_processing(void);
void Aizip_DNR_init(void);
/* 改动原因:Aizip_DNR_init 更名为 xmos_ns_init对接 libxmos_ns.a。 */
void xmos_ns_init(void);
#if __XC__
} //extern c
#endif
#endif //RINGBUFFER_H

View File

@@ -0,0 +1,33 @@
#ifndef __NS_API_H__
#define __NS_API_H__
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
/* 改动原因:由 Aizip DNR 切换为 XMOS NS 库,初始化 NS 处理链及默认运行状态。 */
void ns_xmos_xc_init(void);
/*
* 改动原因:运行时控制 NS/EQ 子模块开关C1 仅使用 NSEQ 由主 EQ 引擎处理故 eq_enable=0。
* ns_enable: 0 旁路 NS非 0 开启
* eq_enable: 0 旁路 NS 内建 EQ非 0 开启
*/
void ns_xmos_xc_set_module_enable(int ns_enable, int eq_enable);
/* 改动原因NS 库内建 10 段 EQ 增益设置C1 默认全 0 旁路。 */
void ns_xmos_xc_eq_set_all_gains(int16_t *gains);
void ns_xmos_xc_eq_set_band_gain(int band, int16_t gain);
/*
* 改动原因单声道处理block 长度 1024 Samples用户指定替代原 DNR 512/128 帧)。
*/
void ns_xmos_xc_process(int16_t *input, int16_t *output);
#ifdef __cplusplus
}
#endif
#endif

View File

@@ -15,48 +15,21 @@
#include "xc_ptr.h"
#include "tile1_clk.h"
#if BR_UAC2
unsigned g_3d_fps = 2;
#elif XMOS_FPS_EN
#if XMOS_FPS_EN
unsigned g_3d_fps = 1;
#else
unsigned g_3d_fps = 0;
#endif
/* 改动原因factory 无 UAC1 时 UserBufferManagement 不编译,但 user_main 仍赋值 uc_br_data须全局定义避免链接错误 */
unsafe chanend uc_br_data;
/* TODO
- Seperate recording and playback SRC related defines
*/
#if UAC1
#ifndef USE_ASRC
#define USE_ASRC (0)//(0)
#endif
#define DISABLE_ASRC_HIGHER_THAN_192000 1
#ifndef EXTRA_I2S_CHAN_COUNT_IN
#define EXTRA_I2S_CHAN_COUNT_IN (2)
#endif
#ifndef EXTRA_I2S_CHAN_INDEX_IN
#define EXTRA_I2S_CHAN_INDEX_IN (0)//(0)
#endif
#ifndef EXTRA_I2S_CHAN_COUNT_OUT
#define EXTRA_I2S_CHAN_COUNT_OUT (0)
#endif
#ifndef EXTRA_I2S_CHAN_INDEX_OUT
#define EXTRA_I2S_CHAN_INDEX_OUT (0)//(0)
#endif
#define DATA_BITS (32)
#define SAMPLE_FREQUENCY (48000)
#define MASTER_CLOCK_FREQUENCY (24576000)
unsafe chanend uc_i2s;
unsafe chanend uc_br_data;
/* Note, re-using I2S data lines on MC audio board for LR and Bit clocks */
@@ -95,12 +68,7 @@ void UserBufferManagement(unsigned sampsFromUsbToAudio[], unsigned sampsFromAudi
GET_SHARED_GLOBAL(tile1_ready, g_tile1_audio_ready);
#endif
if (l_3d_fps == 2)
{
if (tile1_ready)
buffer_exchange((chanend) uc_br_data, sampsFromUsbToAudio, sampsFromAudioToUsb, NUM_USB_CHAN_OUT);
}
else if (l_3d_fps == 1)
if (l_3d_fps == 1)
{
if (tile1_ready)
buffer_exchange((chanend)uc_br_data, sampsFromUsbToAudio, sampsFromAudioToUsb, 2);
@@ -108,22 +76,14 @@ void UserBufferManagement(unsigned sampsFromUsbToAudio[], unsigned sampsFromAudi
if (dnr_enable)
{
dnr_exchange_buffer((int32_t *)&sampsFromAudioToUsb[EXTRA_I2S_CHAN_INDEX_IN]);
dnr_exchange_buffer((int32_t *)&sampsFromAudioToUsb[0]);
}
else
{
sampsFromAudioToUsb[0] = sampsFromAudioToUsb[1];
}
if (adc_loop)
{
// sampsFromUsbToAudio[0] = (sampsFromAudioToUsb[1]) + (sampsFromUsbToAudio[0]);
// sampsFromUsbToAudio[1] = (sampsFromAudioToUsb[1]) + (sampsFromUsbToAudio[1]);
}
// sampsFromAudioToUsb[0] = sampsFromUsbToAudio[0];
// sampsFromAudioToUsb[0] = tmp;
}
}
#endif
}
#endif

View File

@@ -10,8 +10,10 @@
#include "xc_ptr.h"
#include "xua_conf.h"
/* 改动原因FPS库V1.5改为单核xc接口使用fps_api.h中的fps_xmos_xc_*声明 */
#if XMOS_FPS_EN
/* 改动原因FPS库V1.5改为单核xc接口使用fps_api.h中的fps_xmos_xc_*声明factory 不链接 libxmos_fps 故不编译 */
#include "fps_api.h"
#endif
#include "fps_eq_sync.h"
@@ -97,6 +99,8 @@ void fps_eq_publish_mode_and_gains(unsigned mode, const int16_t gains[FPS_EQ_BAN
fps_eq_publish_gains_to_shared(gains);
}
#if XMOS_FPS_EN
void fps_apply_eq_mode(void)
{
int16_t gains[FPS_EQ_BAND_COUNT];
@@ -258,3 +262,5 @@ void fps1_dsp_proc_task()
}
}
}
#endif /* XMOS_FPS_EN */

View File

@@ -520,6 +520,14 @@ int main()
{
USER_MAIN_CORES
#if XMOS_NS_EN
/* 改动原因XMOS NS 降噪在 tile[0] 独立核运行,与 extra_i2s 的 triple-buffer 配合处理 1024 样点块。 */
on tile[0]: {
set_core_high_priority_on();
dnr_dsp_proc_task();
}
#endif
#if XMOS_FPS_EN
on tile[1]: {
debug_printf("start fps_main\n");
@@ -532,12 +540,6 @@ int main()
set_core_high_priority_on();
fps1_dsp_proc_task();
}
#else
#if UAC1
on tile[1]: {
dsp_main(c_data_transport, cc_br_eof);
}
#endif
#endif
#if (((XUA_SYNCMODE == XUA_SYNCMODE_SYNC && !XUA_USE_SW_PLL) || XUA_SPDIF_RX_EN || XUA_ADAT_RX_EN))
on tile[PLL_REF_TILE]: PllRefPinTask(i_pll_ref, p_pll_ref);

View File

@@ -3,7 +3,6 @@
#define _USER_MAIN_H_
#ifdef __XC__
#if (!MQA_EN)
#include "app_dsp.h"
// 改动原因mode/mic mute LED物理端口在tile1定义跨tile的LED控制interface供tile0按键逻辑调用tile1统一驱动硬件LED。
@@ -13,8 +12,7 @@ interface c1_led_ctrl_if {
// 改动原因:规格 mic 指示灯仅反映静音——0=静音红灯常亮1=非静音全灭DNR 无灯由 APP 显示。
void set_mic_mute_state(unsigned mute_switch);
};
void switch_handler(void);
void flag_handler();
/* 改动原因:固件升级 START 在 AudioHwRemote2 处理,需传入 c_dfu其余升级命令在 process_send_params 直接处理 */
void AudioHwRemote(streaming chanend c, client interface c1_led_ctrl_if i_c1_led_ctrl, streaming chanend c_dfu, chanend c_app_sync);
void i2s_driver(chanend c);
@@ -55,7 +53,7 @@ extern unsigned g_fps_drc_mode;
unsafe { \
uc_audiohw = (chanend) c_audiohw;\
uc_dfu = (chanend) c_dfu;\
/* 改动原因FPS/BR 音频经 c_data_transport 与 tile1 fps_main 交换;未赋值 uc_br_data 会导致 UserBufferManagement buffer_exchange ECALL */\
/* 改动原因FPS/BR 音频经 c_data_transport 与 tile1 fps_main 交换;factory 亦定义 uc_br_data 占位,避免链接错误 */\
uc_br_data = (chanend) c_data_transport;\
} \
}\
@@ -65,11 +63,6 @@ extern unsigned g_fps_drc_mode;
on tile[1]: app_control_slave(i_c1_led_ctrl, c_app_sync); \
\
#else
#define USER_MAIN_DECLARATIONS_A
#define USER_MAIN_CORES_A // on tile[0]:{board_setup();}
#endif
#endif