📄 iir2ndlpf.eve
字号:
// 僒儞僾儖僾儘僌儔儉 IIR2ndLPF.eve
//
// 擇師偺 IIR 偱 Low Pass Filter (LPF) 傪幚尰偡傞僾儘僌儔儉偱偡丅
// SDI0 偺 Lch 偵擖椡偝傟偨怣崋偵僇僢僩僆僼廃攇悢 (fc) 偑 100Hz
// (僒儞僾儕儞僌廃攇悢 fs=48kHz 帪) 偺 LPF 傪偐偗 SDO0 偺 Lch 偵
// 弌椡偟偰偄傑偡丅
// SDO0 偺 Lch 埲奜偺僠儍儞僱儖偼偡傋偰 0 弌椡偱偡丅
//
// fc 偑 200Hz 埲壓偺擇師偺 LPF 偱偼學悢惛搙偑 16bit 偱偼懌傝側偄
// 応崌偑偁傝傑偡丅偙偺傛偆側応崌偼丄偙偺僒儞僾儖僾儘僌儔儉偺傛偆
// 側墘嶼庤朄傪庢傞偙偲偵傛傝丄學悢惛搙 28bit 傑偱奼挘偡傞偙偲偑偱
// 偒傑偡丅
//
// 椺偊偽丄28bit 偺學悢偑 0x9ABCDEF 偺応崌丄偙偺學悢偼
// 0x9ABCDEF = 0x9ABC + (0x0DEF)*2^(-12)
// 偲暘夝偱偒傑偡丅偮傑傝丄忋埵懁 0x9ABC 偲壓埵懁 0x0DEF 偵暘夝偟
// 偰墘嶼偡傞偙偲偵傛傝丄嵟廔揑偵學悢惛搙 28bit 偺墘嶼傪幚尰偡傞偙
// 偲偑偱偒傑偡丅偙偺嵺丄壓埵懁學悢偺忋埵 4bit 偼偡傋偰 0 偵側傞偙
// 偲偵拲堄偟偰偔偩偝偄丅
//
// 僔僌僫儖僼儘乕 IIR2ndLPF.pdf 傪嶲徠偟偰偔偩偝偄丅
//
// fc 偑 200Hz 埲忋偺擇師偺 LPF 偺応崌偵偼丄捠忢丄學悢惛搙 16bit
// 偱傕廫暘偱偡偺偱丄IIR2ndHPF.eve 偲摨偠傾儖僑儕僘儉偱寁嶼壜擻
// 偱偡丅
//
// 側偍丄僾儘僌儔儉偱偼 0dBFS 擖椡帪偺墘嶼僆乕僶乕僼儘乕傪夞旔偡傞偨傔
// 擖椡怣崋傪 -6dB 偟丄僼傿儖僞墘嶼屻 +6dB 偟偰尦偺儗儀儖偵栠偟偰偄傑偡丅
// 僨乕僞僶僗偺壖悢晹偼 28bit 偁傝傑偡偺偱丄偙偺庤朄偱傕嵟廔 24bit 弌椡偺
// 惛搙偵塭嬁傪梌偊傞偙偲偼偁傝傑偣傫丅
//
//
// 偙偺僾儘僌儔儉傪傾僙儞僽儔 EveAsm.exe 偱傾僙儞僽儖偡傞偙偲偵傛傝
// IIR2ndLPF.datEve 偑嶌惉偝傟傑偡丅
//
// -----------------------------------------------------------------
//
// Sample program IIR2ndHPF.eve
//
// This is the program realizing 2nd-order IIR Low Pass Filter (LPF).
// LPF of fc(cutoff frequency)=100Hz (at fs=48kHz) is applied to SDI0 Lch
// input signal, and the result is output from SDO0 Lch.
// The other channels except for SDO0 Lch are all zero output.
//
// 16bit is not enough in some cases when fc of 2nd-order LPF is lower than
// 200Hz. In such case, coefficient precision can be extended to 28bit by
// using the calculating method in this program.
//
// For example, when the 28bit coefficient is 0x9ABCDEF, this coefficient
// can be expressed as below.
// 0x9ABCDEF = 0x9ABC + (0x0DEF)*2^(-12)
// That means 28bit precision calculation can be achieved by dividing the
// the operation to higher 0x9ABC and lower 0x0DEF. Be careful that the most
// significant 4 bits of lower part is always 0.
//
// Refer to the signal flow IIR2ndLPF.pdf.
//
// 16bit is enough in most cases when fc of 2nd-order LPF is higher than
// 200Hz. In such case, it is possible to use same algorithm as IIR2ndHPF.eve.
//
// In order to prevent digital overflow when the input is 0dBFS, input signal
// is attenuated by 6dB first and boosted after the filter calculation by 6dB
// in this program. This method does not affect at all to 24bit precision output
// because the mantissa (fractional part) of data bus is 28bit.
//
//
// IIR2ndLPF.datEve is assemble from this program by executing EveAsm.exe.
// -----------------------------------------------------------------
// -----------------------------------------------------------------
// -----------------------------------------------------------------
#define ERAM_TYPE NO_ERAM //奜晅 RAM 側偟
//============================================================
// EVE Program
// IIR2ndLPF
//============================================================
// COEF define
// fs 偵傛偭偰曄壔偡傞學悢
CDat A0H (-1, 0x0000); // 100Hz LPF (fs=48kHz, Q=0.707)
CDat A0L (-1, 0x0B20); //
CDat A1H (-1, 0x0001); //
CDat A1L (-1, 0x0641); //
CDat A2H (-1, 0x0000); //
CDat A2L (-1, 0x0B20); //
CDat B1H (-1, 0x7ED0); //
CDat B1L (-1, 0x0A98); //
CDat B2H (-1, 0xC12C); //
CDat B2L (-1, 0x08E4); //
// fs 偵傛偭偰曄壔偟側偄學悢
CDat P0.5 (-1, 0x4000); //
CDat P2e12 (-1, 0x0008); // 2^(-12)
// Inner DATA define
DAdr Dtmp (0); // temporary 梡
DAdr DF (1); //
//------------------------------------------------------------
// 幚峴僐儅儞僪僽儘僢僋
// | ERAM | BUS | MAC/JMP
//------------------------------------------------------------
; Dtmp = IN0; ACC0 = Dtmp *P0.5; // SDI0/L (IN0) 傪 Dtmp 傊丅
; ; ; // overflow 夞旔偺偨傔 Dtmp 傪 -6dB 偡傞丅
; ; ;
; ; ;
//---------------------------
; (DF+0) = ACC0F; ACC0 = (DF+0) *A0L; // filter 墘嶼丅
; ; ACC0+= (DF+1) *A1L; //
; ; ACC0+= (DF+2) *A2L; //
; ; ACC0+= (DF+3) *B1L; //
; ; ACC0+= (DF+4) *B2L; //
; ; ACC0 = (DF+0) *A0H; //
; ; ACC0+= (DF+1) *A1H; //
; ; ACC0+= (DF+2) *A2H; //
; Dtmp = ACC0F; ACC0+= Dtmp *P2e12; //
; ; ACC0+= (DF+3) *B1H; //
; ; ACC0+= (DF+4) *B2H; //
; ; ;
; ; ;
; ; ;
; (DF+2) = ACC0Fs1; ACC0 = (DF+2) *P0.5; // 1bit shift 偵拲堄丅RAM 傊偼 Float 偱 save丅
//---------------------------
; ; ; // -6dB 偝傟偰偄偨 data 傪 +6dB 偟丄尦偵栠偡丅
; ; ;
; ; ;
; OUT0 = ACC0Ls2; ; // OUT 傊偼 Linear 偱 save丅
// ----------------------------------------------------------------------
; OUT1 = $ZERO; ; // 懠偺 channel 傪 0 clear丅
; OUT2 = $ZERO; ; // 懠偺 channel 傪 0 clear丅
; OUT3 = $ZERO; ; // 懠偺 channel 傪 0 clear丅
; OUT4 = $ZERO; ; // 懠偺 channel 傪 0 clear丅
; OUT5 = $ZERO; ; // 懠偺 channel 傪 0 clear丅
; OUT6 = $ZERO; ; // 懠偺 channel 傪 0 clear丅
; OUT7 = $ZERO; ; // 懠偺 channel 傪 0 clear丅
// ----------------------------------------------------------------------
; MPEND = $0.5; ; // program 廔椆丅
; ; ;
; ; ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -