发烧论坛

注册

 

返回列表 «12345678» / 33
发新话题 回复该主题

计算芯片的发展将让普通CD战胜LP [复制链接]

查看: 50359|回复: 320
41#

头晕,耳朵收货是硬道理
TOP
42#

felixcat 在 2004-11-16 12:49:25 发表的内容
各位朋友,假如有一天你听别人说LP的声音比CD好很多,而下决心投身LP行列的时候,请不要把手中收藏的众多绝版CD处理掉。因为在这几年里面,由于计算机技术的快速发展,现在最新的高级CD唱机将会播出比80年代的CD唱机好n倍的声音。这个听上去有点像天方夜谭,但实际上这是真的,请听我详细道来。

不考虑混音、平衡的不同,现在支持LP的众多烧友所批评CD的缺点,也就是说因为CD格式的取样率和Bit数不够高,导致还原的波形和真实的差别,要比LP的模拟方式大。
永远不可能!

的确,上述这个观点对于80年代CD播放机刚刚面世的时候,或许是对的。为什么?原因是,如下图:

[upload=jpg]Upload/200411169152929375.jpg[/upload]

虚线表示的是真实的声音信号,上面的几个黑点表示是CD格式里面的取样点,假如我们用直线把这些取样点连在一起,作为CD输出的声音曲线,那么从图中就可以看出,这样的输出信号,真的和实际的信号比起来,差别很大。并且很多攻击CD格式的说法,都是用这幅图来作为例子的。

不过也不要小看这种生成输出信号的方法,在数值分析里面,这种方法称为“分段线性插值”,这种算法是一种效率很高、计算速度非常快的算法。在80年代的时候,由于计算芯片的技术还远远不够现在这么发达,所以当时很多解码芯片,很可能(这里只能说很可能,因为每种芯片的制造厂家所采用的解码技术都属于是商业秘密,我没办法知道)就是采用类似的这种线性插值法进行运算的。并且由于CD的格式是每秒有44100个插值点,所以尽管采用这种已经是很简单的算法了,但是这么多的插值点对于当时的解码CPU来讲,我估计也是够呛的(据我所知甚致有的比较廉价的芯片,干脆每两个插值点扔掉一个,也就是说仅仅取其中的22050个数据点进行运算)。可想而之这样的解码芯片,怎么可能会有好声出呢?

有的朋友可能会说,看一些科普介绍文章说,很多解码芯片都是用“曲线”来代替上述的直线的。对,“以曲代直”正是现代芯片的核心问题。考虑到电路设计的可能性,D/A转换一般以多项式的形式来实现比较简便,n次多项式f(x) 是这样定义的:

[upload=jpg]Upload/200411169502580362.jpg[/upload]

其中x是变量,所有的a0,a1,…,an称为系数。它在二维坐标平面里面的图像就是一条曲线。解码芯片的任务就是通过给定的几个数据点,运算出一个多项式(也就是算出各个系数),使得这个多项式的图像:(1)经过给定的那几个数据点;(2)这个多项式曲线要尽量和这些数据点所在的原始的信号曲线吻合。

(未完待续)
TOP
43#

Getz 在 2004-11-16 13:53:45 发表的内容
假如有实际软件能做出这类算法,那就是真的造福大众了
(没人开发...)


呵呵这个不用担心,软件早就有了,Mathematica,Maple,MATLAB这几个软件都是成功的数学计算软件,尤其是MATLAB,特别适用于数值计算。这些著名的插值算法的源程序都不长,比如说对于也是很著名的,工业设计用来“磨滑”带有棱角的折线的“自然三次样条函数插值”法(呵呵名字挺长的,这个算法理解上有一定难度,很多研究生的课本都把这部分内容作为选学而已),它的MATLAB计算源程序如下:

%================
% cBspline.m
%================
function Sx = cBspline(x,x0,h,N)
for l=1N+9)
    %because the indices of t begins with 1, not 0, so write (l-1)*h
    t(l)=x0+(l-1)*h;
end
for m=1N+4)
B(m,1)=F(m,1,x,t,0,0);
end
for k=2:4
for m=1N+4-k)
    B(m,k)=F(m,k,x,t,B(m,k-1),B(m+1,k-1));
end
end
Sx=B(1,4);

______________________________________________

%=======
% F.m
%=======
function y=F(m,k,x,t,y1,y2)
if (k==1)
    if (x>=t(m)) & (x        y=1;
    end
    if (x=t(m+1))
    y=0;
    end
end
% use the recurrence to compute B(j,k), be careful of the indices!
if (k>1)
    y=((x-t(m))/(t(m+k-1)-t(m)))*y1+((t(m+k)-x)/(t(m+k)-t(m+1)))*y2;
end

其中第一个函数将调用第二个子函数。第一个函数里面的x,x0等都是待用户输入的数据点坐标。

假如在座有朋友想看看这个函数的威力,不妨采用下面的测试函数:

%=================
% Bspline.m
%=================


function T=Bspline(x,y,N)
a=cBspline(1,0,1,N);
b=cBspline(2,0,1,N);
A(1,1)=3;
A(1,2)=-6;
A(1,3)=3;
A(26,24)=3;
A(26,25)=-6;
A(26,26)=3;
for j=2:25
    A(j,j-1)=a;
    A(j,j)=b;
    A(j,j+1)=a;
end
c=A^(-1)*y;
T=0;
for j=1:26
    T=T+c(j)*cBsplinej(j,x,0,1,N);
end

________________________________________________________

%=================
% cBsplinej.m
%=================

function Sx = cBspline(j,x,x0,h,N)
for l=1N+9)
% please pay special attention to -3, because we begins with c_{-3,3} here,
% so t_{i} begins with i=-3, which means t={-3,-2,-1,0,1,2,3,...}
    t(l)=x0+(l-1)*h-3;
end
for m=1N+4)
B(m,1)=F(m,1,x,t,0,0);
end
for k=2:4
for m=1:(N+4-k)
    B(m,k)=F(m,k,x,t,B(m,k-1),B(m+1,k-1));
end
end
Sx=B(j,4);

以上是把数据点输进去计算,假如我们想要看视觉上的最终效果,还要执行这个绘图程序:

%=================
% draw.m
%=================

function draw(x,y)
for j=0:0.05:23
    s=Bspline(j,y,30);
    plot(j,s,'b-','MarkerSize',10);
    hold on;
end
for j=1:24
    plot(j-1,x(j),'b *', 'MarkerSize',10);
    hold on;
end

在MATLAB软件之下可以这样来运行:
1. 先把上述的几个源程序分别存成文本文档,并且以.m为后缀名,都放在同一目录下;然后再把MATLAB运行目录设定为前面的那个目录;
2. 在控制窗口内键入:
xj = [ .25  0 -1  1.5  1  1.5   4  4  6   5   3.5 2.5  3.5  5   5.5   3.5  3.5  1.25  1  2  .5  -1   -.25 .25]'; (回车)
y = [ 4    1  0  0    1  3.5  .5  0  0  .5   2.5   4  5.5  7.5 8     8  7.25   4.5    7  8   8   8     7  4]'; (回车)
draw(xj, y)(回车)

等大概10秒钟左右(可见通过软件来实行多项式插值运算速度是比不上硬件直接实现的),漂亮的图像就会绘制出来了。

还有一点很可惜,MATLAB这个软件售价很贵,一套完整的带有齐全Toolbox的MATLAB售价大概要3-4万美元,我也只能在系里的服务器上来运行MATLAB。
TOP
44#

估计楼主要这么玩大概别人很难对上话.
但就我所知,已经比CD先进的XRCD和SACD一样输给LP很多.
TOP
45#

楼主可是真正的博士

——真的希望该贴的研究结果是提出切实可行的cd软解码方法,让大家硬盘也发烧
TOP
46#

好贴,真正用科学去思考一些问题,发烧才能烧出点名堂。
TOP
47#

TOP
48#

我喜欢这样的文章,我从小喜欢数学和计算机,可惜因为走上建筑的道路而荒废了数学和计算机。楼主的文章也只能勉强看懂。
TOP
49#

真正的博士!
TOP
50#

实在是高!研究透了造福广大烧友
TOP
发新话题 回复该主题