13

主题

10

好友

792

积分

贵宾 当前离线

Rank: 3Rank: 3

UID
9409
帖子
658
精华
0
经验
792 点
金钱
323 ¥
注册时间
2006-5-15

社区贡献 论坛贵宾

发表于 2012-12-22 14:45 | 显示全部楼层
本帖最后由 JiangWZ 于 2012-12-22 16:38 编辑

解码器的抖动会导致音频输出信号出现非谐波失真, 而这非谐波失真是人耳所难以接受的, 所以设计电路时要尽可能的把抖动率降低.
对于一个16位20KHz的信号而言, 121pS 的抖动等于LSB也就是最低有效位的变化, 咱们以这个数字的三分之一作为设计目标, 也就是不大于40pS才不会造成信号显著的恶化.
对于一个24位20KHz的信号就更为严峻了, 不过目前市面上最优秀的解码芯片能做到的只是20位精度左右, 以这个精度来说, 抖动率要求是2.5pS以下.

业余条件下咱们可以使用有一定质量的声卡和免费或有试用期的测试软件进行测试. 声卡的ADC部分对抖动比较不敏感, 对比DAC解码部分来说会好了许多, 对一般的解码器测试是足够了.

一般优质的高性能解码器的抖动率是100pS左右, 可以使用测试软件如ARTA来测试, 不过ARTA的抖动测试信号调制峰值是-123dB左右, 只能测试到10pS以上的jitter, 如果要测试更低的抖动率就不行了.

于是俺编写了一个函数由STM32F405单片机来生成这个更高精度的抖动率测试信号:

生成一个大约是-3分贝幅度的测试信号, 这个正弦波频率是采样率的整倍分数, 44.1K的四分之一采样率 = 11025Hz, 再以192分之一的采样率(229.6875Hz)来调制这个信号, 调制幅度是24位中最小的一个位, 这样调制幅度的变化就会低于-160dB而被底噪淹没了, 也不会造成观察FFT频谱时误判了. 这里用了 0xBFFFFE, 0xBFFFFE, 0x400001,0x400001 重复24次, 然后每192个周期一次 0xC00000, 0xC00000, 0xC00000, 0xC00000.  最后不停的循环这2组数据. 这样一个最低有效值位数的轻微调制会导致几乎所有的24位数据发生0和1的翻转变化,也就是说可以诱发产生极致恶化的抖动以便于观察了.
每个周期刚好是四个采样点, 每个采样点都固定在同一个相位和幅度, 因为加入了229.6875Hz方波的调制, 所以在11,025Hz 的左右2边每间隔229.6875Hz会产生一个抖动峰值, 这样就可以轻易从FFT频谱观察到和计算抖动的幅度了. (倘若采样点不是整倍数, 每个周期的采样点的相位和幅度都会不断的变化, 这样的话所产生的抖动峰值就不断的移动而不是固定的, 看起来像噪音一样, 也就无法直接观察到了)
测试频谱时设置了MI软件的FFT窗口为 Kaiser7 以降低频谱泄漏, 和四百万个采样点数来提高解析度.

从频谱图找出基频11025Hz以外近端的最高峰值之后就可以用下面的公式来计算出抖动率了:
信号幅度 [db] = 20 log ( 1 / ( 2 x 3.1416 x 信号频率 [Hz] x jitter [pico-second] ) )

峰值dB = 20 log ( 1 / (69272 x jitter) )

-103.2dB = 100pS 抖动率
-109.2dB = 50pS  抖动率
-123.2dB = 10pS  抖动率
-143.2dB = 1pS   抖动率

下面这个是ARTA测试软件生成的24位44.1K抖动测试音频文件的开头部分

00000000  52 49 46 46 48 40 F2 00-57 41 56 45 66 6D 74 20   RIFFH@..WAVEfmt
00000010  28 00 00 00 FE FF 02 00-44 AC 00 00 98 09 04 00   (.......D.......
00000020  06 00 18 00 16 00 18 00-00 00 00 00 01 00 00 00   ................
00000030  00 00 10 00 80 00 00 AA-00 38 9B 71 66 61 63 74   .........8.qfact
00000040  04 00 00 00 00 00 00 00-64 61 74 61 00 40 F2 00   ........data.@..
00000050  80 00 C0 80 00 C0 80 FF-BF 80 FF BF 80 00 40 80   ..............@.
00000060  00 40 80 00 40 80 00 40-80 FF BF 80 FF BF 80 FF   .@..@..@........
00000070  BF 80 FF BF 80 00 40 80-00 40 80 00 40 80 00 40   ......@..@..@..@
00000080  80 FF BF 80 FF BF 80 FF-BF 80 FF BF 80 00 40 80   ..............@.
00000090  00 40 80 00 40 80 00 40-80 FF BF 80 FF BF 80 FF   .@..@..@........
000000A0  BF 80 FF BF 80 00 40 80-00 40 80 00 40 80 00 40   ......@..@..@..@
000000B0  80 FF BF 80 FF BF 80 FF-BF 80 FF BF 80 00 40 80   ..............@.
000000C0  00 40 80 00 40 80 00 40-80 FF BF 80 FF BF 80 FF   .@..@..@........
000000D0  BF 80 FF BF 80 00 40 80-00 40 80 00 40 80 00 40   ......@..@..@..@
000000E0  80 FF BF 80 FF BF 80 FF-BF 80 FF BF 80 00 40 80   ..............@.
000000F0  00 40 80 00 40 80 00 40-80 FF BF 80 FF BF 80 FF   .@..@..@........

我们可以看出来测试数据是循环 0xBFFF80 0xBFFF80 0xBFFF80 0xBFFF80 0x400080 0x400080 0x400080 0x400080, 然后每隔192个采样就加入调制信号 0xC00080 0xC00080 来代替一组 0xBFFF80 0xBFFF80
每一个数据的最后都是 80, 不会变化, 也就是说虽然数据是24位的, 然而却调制到最后精度只有16位而已.

SD卡无损播放器照片.jpg

播放器板子照片1.JPG

播放器192K显示.jpg

播放器96K显示.jpg

以下是使用ARTA测试软件生成的音频测试文件写入SD卡后再由播放器来播放, 音频输出接到EMU-1212m声卡的输入以MI软件测试所得到的结果. 播放器的解码器是ES9018, 主基准时钟是5元一枚的廉价贴片晶振.

ARTA抖动测试液晶显示.jpg

播放器抖动率测试_ARTA信号1.JPG
  
图中可以看出来基频11025Hz的左右2边间隔229.6875Hz就会产生一个小峰值, 所有的小峰值都基本是一样的幅度, -123dB左右(10pS) 没有任何突出的一个, 这意味着这是调制信号本身的幅度, 被测的解码器所产生的抖动率低于调制信号都被掩埋瞅不见了.

这是生成更高精度测试信号的源代码:

switch(SignalType)
{
case jitter:   /* 生成 11025Hz 信号, 幅度 -3dB, 调制信号 229.6875Hz */
  while(dest < PCM_BlockSize/4)   
    {
        for( count=0; count<48; count++ )          //48 * 4 个周期每声道
       {
             for( count0=0; count0<4; count0++ )         //下半个周期2个采样点, 225度和315度, 左右声道就是4个采样点
         {
                buff[dest++] = 0xFE00BFFF;                 //字节大端次序 2301
             }
             for( count0=0; count0<4; count0++ )         //上半个周期2个采样点, 45度和135度, 左右声道就是4个采样点
         {
                buff[dest++] = 0x01004000;                 //字节大端次序 2301
             }
       }
          buff[dest-384] = 0x0000C000;                  //每192个周期加入调制信号=229.6875Hz, 左右声道就双倍地址
       buff[dest-383] = 0x0000C000;
    }
break;

以下是直接由播放器单片机STM32F405生成更高精度测试信号以I2S送到ES9018. 主基准时钟是5元一枚的廉价贴片晶振, 音频输出接到EMU-1212m声卡的输入以MI软件测试所得到的结果.

抖动测试液晶显示.jpg

播放器抖动率测试1.JPG
  
图中可以看出来基频11025Hz的左右2边有许多高低不一的小峰值, 最高幅度在-140dB 以下, 可以算出抖动率是低于2pS (也许是声卡的极限). 以一枚5元的贴片晶振为时基而得到如此优秀的效果, ES9018 确实是有效的解决了抖动的问题.

以下顺便提供2张硬件默认和软件优化设置ES9018的频谱图:

SPDIF液晶显示.jpg

硬件默认

硬件默认


软件优化

软件优化


可以看出来软件优化后的高次谐波和高频干扰降低了许多.

评分

参与人数 1经验 +10 魅力 +10 收起 理由
Biglee_163 + 10 + 10 太专业化的描述

查看全部评分

120

主题

1

好友

9137

积分

贵宾 当前离线

Rank: 3Rank: 3

UID
9985
帖子
4309
精华
1
经验
9137 点
金钱
2729 ¥
注册时间
2006-6-8

论坛贵宾

发表于 2012-12-22 14:58 | 显示全部楼层
感谢分享~

140

主题

0

好友

6122

积分

版主 当前离线

Rank: 7Rank: 7Rank: 7

UID
30154
帖子
6535
精华
0
经验
6122 点
金钱
6370 ¥
注册时间
2007-11-9

社区贡献 论坛版主

发表于 2012-12-22 15:28 | 显示全部楼层
解码器的抖动会导致音频输出信号出现非谐波失真, 而这非谐波失真是人耳所难以接受的, 所以设计电路时要尽可 ...
JiangWZ 发表于 2012-12-22 14:45


老兄好 你的板子和代码都是自己搞的嘛

13

主题

10

好友

792

积分

贵宾 当前离线

Rank: 3Rank: 3

UID
9409
帖子
658
精华
0
经验
792 点
金钱
323 ¥
注册时间
2006-5-15

社区贡献 论坛贵宾

 楼主| 发表于 2012-12-22 15:49 | 显示全部楼层
本帖最后由 JiangWZ 于 2012-12-22 15:52 编辑

俺只是设计了电路, 然后发Gerber文件给国内的朋友帮忙开板子, 元件焊接完成了再寄回来给俺写代码, 文件系统 FATFS 是移植了ChanN 的, Flac 解码部分是移植了Rockbox的, 做了适应本单片机的一些优化, SDIO和USB驱动是使用了库文件, 其他的代码是花了几个月慢慢敲出来的.

140

主题

0

好友

6122

积分

版主 当前离线

Rank: 7Rank: 7Rank: 7

UID
30154
帖子
6535
精华
0
经验
6122 点
金钱
6370 ¥
注册时间
2007-11-9

社区贡献 论坛版主

发表于 2012-12-22 16:06 | 显示全部楼层
俺只是设计了电路, 然后发Gerber文件给国内的朋友帮忙开板子, 元件焊接完成了再寄回来给俺写代码, 文件系统 ...
JiangWZ 发表于 2012-12-22 15:49


我最近也在学搞播放器 目前常用的方案有 DSPIC33F   AT91SAMS64  STM32F103等 您觉得现在哪个方案合适些   DSPIC33我有参考的代码  但性能估计弱一点  其他的性能强 但我没有参考的代码

56

主题

12

好友

6087

积分
     

青铜剑侠 当前离线

小熊猫

Rank: 8Rank: 8

UID
59487
帖子
7495
精华
0
经验
6087 点
金钱
5744 ¥
注册时间
2008-10-20
发表于 2012-12-22 16:25 | 显示全部楼层
我最近也在学搞播放器 目前常用的方案有 DSPIC33F   AT91SAMS64  STM32F103等 您觉得现在哪个方案合适些 ...
octflower 发表于 2012-12-22 16:06


这些只能用SPI读SD卡。

140

主题

0

好友

6122

积分

版主 当前离线

Rank: 7Rank: 7Rank: 7

UID
30154
帖子
6535
精华
0
经验
6122 点
金钱
6370 ¥
注册时间
2007-11-9

社区贡献 论坛版主

发表于 2012-12-22 16:29 | 显示全部楼层
这些只能用SPI读SD卡。
卡西利亚斯 发表于 2012-12-22 16:25



对 貌似还有个SDIO  有什么区别?

56

主题

12

好友

6087

积分
     

青铜剑侠 当前离线

小熊猫

Rank: 8Rank: 8

UID
59487
帖子
7495
精华
0
经验
6087 点
金钱
5744 ¥
注册时间
2008-10-20
发表于 2012-12-22 16:40 | 显示全部楼层
对 貌似还有个SDIO  有什么区别?
octflower 发表于 2012-12-22 16:29



SDIO速度更快。

140

主题

0

好友

6122

积分

版主 当前离线

Rank: 7Rank: 7Rank: 7

UID
30154
帖子
6535
精华
0
经验
6122 点
金钱
6370 ¥
注册时间
2007-11-9

社区贡献 论坛版主

发表于 2012-12-22 17:19 | 显示全部楼层
SDIO速度更快。
卡西利亚斯 发表于 2012-12-22 16:40


SDIO方式的话 对单片机有什么要求?

56

主题

12

好友

6087

积分
     

青铜剑侠 当前离线

小熊猫

Rank: 8Rank: 8

UID
59487
帖子
7495
精华
0
经验
6087 点
金钱
5744 ¥
注册时间
2008-10-20
发表于 2012-12-22 17:27 | 显示全部楼层
SDIO方式的话 对单片机有什么要求?
octflower 发表于 2012-12-22 17:19


你的单片机要有SDIO,这个就是要求。

32

主题

1

好友

885

积分

职业侠客 当前离线

Rank: 5Rank: 5

UID
163
帖子
2473
精华
0
经验
885 点
金钱
456 ¥
注册时间
2004-3-25
发表于 2012-12-22 23:28 | 显示全部楼层
有意义的思路和方法,顶给高手审评

45

主题

1

好友

2557

积分

罗宾汉 当前离线

择其道而行之

Rank: 7Rank: 7Rank: 7

UID
16071
帖子
2580
精华
1
经验
2557 点
金钱
2220 ¥
注册时间
2006-12-17
发表于 2012-12-23 13:19 | 显示全部楼层
江兄自己发帖子了,顶一下

32

主题

0

好友

3557

积分

贵宾 当前离线

来自上海的

Rank: 3Rank: 3

UID
8411
帖子
3221
精华
3
经验
3557 点
金钱
1884 ¥
注册时间
2006-4-5

社区贡献

发表于 2012-12-23 13:26 | 显示全部楼层
江兄沉寂了几年,终于回归了,你是我们菜鸟的偶像啊

49

主题

8

好友

2334

积分

罗宾汉 当前离线

Rank: 7Rank: 7Rank: 7

UID
239698
帖子
2480
精华
0
经验
2334 点
金钱
2202 ¥
注册时间
2010-9-12
发表于 2012-12-23 13:47 | 显示全部楼层
数字播放器是大势所趋,关注一下。

19

主题

2

好友

1429

积分

侠之大者 当前离线

Rank: 6Rank: 6

UID
476002
帖子
1408
精华
0
经验
1429 点
金钱
1294 ¥
注册时间
2012-2-29
发表于 2012-12-23 14:20 | 显示全部楼层
帮南阳兄顶一下

1

主题

0

好友

250

积分

业余侠客 当前离线

Rank: 4

UID
516620
帖子
332
精华
0
经验
250 点
金钱
214 ¥
注册时间
2012-8-5
发表于 2012-12-23 14:40 | 显示全部楼层
好文,帮頂。

5

主题

0

好友

78

积分

论坛游民 当前离线

Rank: 3Rank: 3

UID
75688
帖子
75
精华
0
经验
78 点
金钱
76 ¥
注册时间
2009-1-18
发表于 2012-12-23 15:16 | 显示全部楼层
強! 博士論文一樣 要慢慢看, 再找一些資料參考, 才開始慢慢明白

13

主题

1

好友

1395

积分

认证会员 当前离线

Rank: 4

UID
30337
帖子
1584
精华
0
经验
1395 点
金钱
1371 ¥
注册时间
2007-11-12

认证会员

发表于 2012-12-23 22:14 | 显示全部楼层
你的单片机要有SDIO,这个就是要求。
卡西利亚斯 发表于 2012-12-22 17:27



    哈哈,卡西厉害。

这么强的帖子,肯定可以看到卡西的出现。

13

主题

1

好友

1395

积分

认证会员 当前离线

Rank: 4

UID
30337
帖子
1584
精华
0
经验
1395 点
金钱
1371 ¥
注册时间
2007-11-12

认证会员

发表于 2012-12-23 22:17 | 显示全部楼层
解码器的抖动会导致音频输出信号出现非谐波失真, 而这非谐波失真是人耳所难以接受的, 所以设计电路时要尽可 ...
JiangWZ 发表于 2012-12-22 14:45



传说中的J-test   
一般几块钱的晶振都能做到几个PS。
LZ应该把11Khz附件的频谱放大来看看低频部分的jitter

56

主题

12

好友

6087

积分
     

青铜剑侠 当前离线

小熊猫

Rank: 8Rank: 8

UID
59487
帖子
7495
精华
0
经验
6087 点
金钱
5744 ¥
注册时间
2008-10-20
发表于 2012-12-23 22:25 | 显示全部楼层
传说中的J-test   
一般几块钱的晶振都能做到几个PS。
LZ应该把11Khz附件的频谱放大来看看低频部分 ...
chenxiuping15 发表于 2012-12-23 22:17


早就这样用了............. 都是些简单测试方法。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Powered by Discuz! X3.4

© 2001-2012 Comsenz Inc.

返回顶部