您尚未登录。

楼主 # 2023-05-18 19:43:50

xfdr0805
会员
注册时间: 2020-07-23
已发帖子: 291
积分: 344

如何将计算出的系数转换为tas5805对应DSP数据?

现在我可以根据一些数据来计算出系数,计算出的系数与PPC3的一样,但是不知道计算出的浮点数据是如何转换tas5805可以使用的数据的?

2023-05-18_185216.png

这是我写的程序,仅仅测试用,如果有人需要我可以传上来
2023-05-18_185116.png

离线

楼主 #1 2023-05-18 22:38:46

xfdr0805
会员
注册时间: 2020-07-23
已发帖子: 291
积分: 344

Re: 如何将计算出的系数转换为tas5805对应DSP数据?

STA311B的我知道,手册上有写  sta311b 有8个通道,每通道有10段EQ。tas5805 2个声道,每声道有15段EQ
2023-02-21_090847.png
2023-02-03_161351.png

离线

楼主 #2 2023-05-18 22:46:18

xfdr0805
会员
注册时间: 2020-07-23
已发帖子: 291
积分: 344

Re: 如何将计算出的系数转换为tas5805对应DSP数据?

还有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

离线

楼主 #3 2023-05-25 14:55:25

xfdr0805
会员
注册时间: 2020-07-23
已发帖子: 291
积分: 344

Re: 如何将计算出的系数转换为tas5805对应DSP数据?

感谢ti工程师的帮助!已经搞定了 放上eq计算的代码 分享给大家EQ_Calculation.zip

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn