现在我可以根据一些数据来计算出系数,计算出的系数与PPC3的一样,但是不知道计算出的浮点数据是如何转换tas5805可以使用的数据的?
这是我写的程序,仅仅测试用,如果有人需要我可以传上来
离线
STA311B的我知道,手册上有写 sta311b 有8个通道,每通道有10段EQ。tas5805 2个声道,每声道有15段EQ
离线
还有TI的这个DSP TLV320AIC3xxx 这个文档写白非常清楚,但不适用于tas5805.
一般 AIC31 系列为 16 位系数,而 AIC32 系列为 24 位系数,具体可以查看对应的数据手册。在
Resolution 位置设定对应的系数位数并回车,下面的窗口就显示出对应的滤波器情况,传输函数和对
应的参数的数值。这些数值即可用于写入 CODEC 内部对应的系数寄存器。数值的排列和窗口上面所
列的传输函数是对应的,比如对于两阶滤波器,有 N0, N1, N2 和 D1, D2 分别对应列出的 5 组数值。
而对于一阶的滤波器,N2 和 D2 为 0,所以只有三个系数,对应 N0, N1 和 D1。这些数值的定义和
CODEC 的数据手册中的定义是相对应的。
文档最后还给出了用程序计算 EQ 的参数的代码
最后举例说明在程序中怎样实时计算 EQ 的参数。通常 EQ 需要根据给定的频率带宽和增益来实时调整
的,其他类型的滤波器一般没有这种需求。在文档 SLAA447 中,作者给出了公式的推导方法和
Matlab 的工具生成的参数的转换方法,没有介绍怎样用代码将这些东西实现并联系起来,这里不在重
复 SLAA447 中讲的变换过程,直接给出经过测试验证正确的代码和简单注释供参考,从代码和注释来
看,转换的过程更加清晰和直观。
#include <stdio.h>
#include <math.h>
int main(int argc, char **argv){
double res = 8388607; /* 这是一个常量: (2^(B-1)–1); 24位系数: 8388607, 16位: 32767 */
double dBVal = 3; /* 增益 */
double SRVal = 48000; /* 采样率 */
double F0Val = 300; /* 频点 */
double BWVal = 100; /* 带宽 */
double A, omega, sn, cs, alpha; /* 中间量,S域到Z域双线性变换使用 */
double a0, a1, a2, b0, b1, b2; /* 系数,计算用中间量 */
double absMax = 0; /* 将b0, b1, b2转为小数时使用 */
int N0, N1, N2, D1, D2; /* 保存计算的系数结果 */
A = pow(10, (dBVal)/40);
omega = 2 * M_PI * (F0Val)/(SRVal);
sn = sin(omega);
cs = cos(omega);
alpha = A*sn/(2*F0Val/BWVal); /* 对于Peak EQ, Q = Q/A */
b0 = 1 + (alpha*A); /* 这里开始根据S域到Z域的映射计算Z域的系数 */
b1 = -1 * cs; /* 这里在转换的时候本应当乘以-2, 但是CODEC内部已经乘以2,所以这里只能乘以1 */
b2 = 1 - (alpha*A);
a0 = 1 + (alpha/A);
a1 = -1 * cs; /* 同上,这里本应乘以-2 */
a2 = 1 - (alpha/A);
b0 /= a0; /* 这里开始将a0变换为1 */
if(fabs(b0) > absMax) absMax = fabs(b0); /* 获取b0, b1, b2的最大绝对值 */
b1 /= a0;
if(fabs(b1) > absMax) absMax = fabs(b1);
b2 /= a0;
if(fabs(b2) > absMax) absMax = fabs(b2);
a1 /= (-1*a0); /* a1, a2乘以-1是因为CODEC滤波器的设计,参见第一章的逻辑方框图 */
a2 /= (-1*a0);
6
TLV320AIC3xxx 滤波器的设置与实时调节ZHCA721
if(absMax > 1.0) { /* 确保b0, b1, b2为纯小数 */
b0 /= absMax;
b1 /= absMax;
b2 /= absMax;
}
/* 转换为整数并打印结果。在显示的时候,因为最高位是符号位,所以如果超出位宽24/16位则需要去掉纯符号位,比如FF81AA09实际数
值取0x81AA09就是用于写到CODEC的系数数值 */
N0 = floor(b0*res);
N1 = floor(b1*res);
N2 = floor(b2*res);
D1 = floor(a1*res);
D2 = floor(a2*res);
printf("N0: %04X, N1: %04X, N2:%04X\r\nD1: %04X, D2: %04X\r\n", N0, N1, N2, D1, D2);
return 0;
}
TLV320AIC3xxx滤波器的设置与实时调节
TLV320AIC3xxx滤波器的设置与实时调节.pdf
对应的软件:
TIBQ.exe
离线
感谢ti工程师的帮助!已经搞定了 放上eq计算的代码 分享给大家EQ_Calculation.zip
离线
感谢楼主的无私分享,正需要呢,这个EQ太难调了!!!
离线