add xmos ns
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
BIN
sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dnr/libxmos_ns.a
Normal file
BIN
sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dnr/libxmos_ns.a
Normal file
Binary file not shown.
33
sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dnr/ns_api.h
Normal file
33
sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dnr/ns_api.h
Normal 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 仅使用 NS,EQ 由主 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
|
||||
@@ -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
|
||||
|
||||
@@ -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];
|
||||
@@ -257,4 +261,6 @@ void fps1_dsp_proc_task()
|
||||
SET_SHARED_GLOBAL(fps_buf_ready, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* XMOS_FPS_EN */
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user