h(s)=( as + b) /(s+b) ,(a,b常数).怎么做成数字的?

[复制链接]
2518|11
 楼主| tscmga 发表于 2007-5-17 15:34 | 显示全部楼层 |阅读模式
恩.我不是搞电子的.<br />我做了个程序,是3d声音的.我是把声音数据放到一个双缓冲里面.然后每个插件读他输入的缓冲数据,然后把数据输出到自己的缓冲.然后每个周期交换一次缓冲.我现在已经实现了,延时的插件,数据类型转换,录音,输出,读文件,写文件的插件.<br />我没上过数字信号处理的课程.只有书.<br />3d声音的话,我是照书搞的.但是我有个地方看不明白.就是同一个声音,到达人的耳朵的时候,因为左右耳朵之间隔着一个脑袋,如果声音来自左边,右边的耳朵听到的声音就经过了一个变化.(当然还有许多其他的变换).只考虑这个.<br />传送函数是<br />h(s)=&nbsp;(as+b)/(s+b);<br />左边a=1+sin(thita)&nbsp;右边a=1-sin(thita).&nbsp;(thita是音源相对人脑袋的角度,水平的)<br /><br />b=&nbsp;2c/r;r是脑袋的半径.c是声音的速度340m/s<br /><br />就是左右两个声道的数据经过各自的这样的变换.我用的计算数据类型是32位的浮点数.声音是&nbsp;16位有符号的整数.声音源是16000hz,单声道.输出是&nbsp;16000hz,双声道.然后每个缓冲256个取样.<br /><br />我搞这个是现学现卖.照数字信号处理的书来的.是一知半解.<br /><br />我想这个是个iir滤波器.开始的时候,我不明白这个函数里面s是什么,我把他当z用.然后按照书上的,转成滤波器啦.就是把,数据延时1个hz,然后把当前的插件的结果延时一个hz,作为自己的输入.3个输入,然后混合起来输出,中间的计算是浮点的.结果肯定是错的.<br /><br />我知道书上有从模拟的传递函数变成数字的的函数的方法.但是这个函数不符合冲激响应不变法的那个规则.因为分子和分母次数一样.我就不知道怎么变换了.因为是照书搞的.<br /><br />然后不知道有没用什么这个方面速成的数学书籍没有.<br />然后这个形式的该怎么转换成Z的,然后其余应该就好说了.因为他比较简单,然后后面我自己套套公式,应该可以搞定.如果能表示成延时和加,乘法,那样的也好哦.<br />专家们帮我看看这个题目啊.<br />谢谢啦.<br />
 楼主| tscmga 发表于 2007-5-17 16:19 | 显示全部楼层

我只会套公式.

书上没现成的,我就不会
 楼主| tscmga 发表于 2007-5-17 17:58 | 显示全部楼层

怎么把那个公式变成有个z来表示的.

变成z来表示我就知道怎么编程了
 楼主| tscmga 发表于 2007-5-17 18:44 | 显示全部楼层

是不是代换一下就可以了

h(s)=&nbsp;(as+b)/(s+b);<br />我知道用拉普拉斯变换表示的是连续的那种<br />用z<br />表示的我知道是用z变换表示的,是取样了的.<br /><br />我看了一下有个公式是<br /><br />s=2/T&nbsp;&nbsp;*(1-1/z)/(1+1/z)<br /><br />是不是把这个公式代换一下就可以了.<br />
lbx_00 发表于 2007-5-17 20:51 | 显示全部楼层

用冲激响应不变法或者是双线性变换法

用这两个方法中的一个把传递函数变成z域的传递函数,然后,把这个新的传递函数转化成差分方程。<br /><br />以上的知识,可以买一本《数字信号处理》,它就是专门讲这些的
 楼主| tscmga 发表于 2007-5-17 23:50 | 显示全部楼层

谢谢大侠

谢谢大侠.我从来都没上过这个方面的课.刚刚接触这些.<br /><br />我推导了一下:<br />h(s)=(a*s+b)/(s+b)<br />s=&nbsp;c*(1-1/z)/(1+1/z)&nbsp;&nbsp;&nbsp;----c=2/T<br /><br />得到结果是<br /><br />y=(&nbsp;(ac+b)x+(b-ac)x/z&nbsp;-(b-c)y/z&nbsp;&nbsp;&nbsp;)&nbsp;/(&nbsp;c&nbsp;+&nbsp;b&nbsp;)<br /><br />然后我计算的<br />T=&nbsp;1/16000&nbsp;吧.<br />最后结果是和thita有关系的.<br /><br />a=1+-&nbsp;sin(thita)&nbsp;b=&nbsp;2c/r;<br />当<br />thita=pi/3;<br />有<br />y=(7695.685547*x(n)&nbsp;-895.685486*x(n-1)+28599.998047*y(n-1))/&nbsp;35400.000000&nbsp;<br />y=(63104.312500*x(n)&nbsp;-56304.312500*x(n-1)+28599.998047*y(n-1))/&nbsp;35400.000000&nbsp;&nbsp;<br /><br />我不知道计算是不正确的.只不过,计算后声音沙得厉害.<br />&nbsp;耳机里面有一边的声音很沙沙的.感觉就像耳机破了一样.
 楼主| tscmga 发表于 2007-5-18 00:14 | 显示全部楼层

补充

thita&nbsp;pi/3<br />的时候<br />y=1.782608*x(n)&nbsp;-1.590517*x(n-1)+&nbsp;0.807910*y(n-1)&nbsp;<br />y=&nbsp;0.217392*x(n)&nbsp;-0.025302*x(n-1)+&nbsp;0.807910*y(n-1)<br /><br />书上说,那个系统函数是一个一个零点一个极点的系统.然后极点是不变的,通过移动零点来改变评论响应.<br />然后他说要是声音直接对着哪个耳朵,哪边的声音的高频就会有6db的提高.<br /><br />我看不出来这个函数对频率有什么影响,
 楼主| tscmga 发表于 2007-5-18 07:37 | 显示全部楼层

是声音转换的问题的.

我从44khz的mp3,转换成8000khsz,然后又换成16000hz,所以有这个问题.
 楼主| tscmga 发表于 2007-5-18 07:56 | 显示全部楼层

哈哈.有点感觉了.

感觉和hrtf差不多的效果了.就是感觉有个东西在脑袋边上放歌.
 楼主| tscmga 发表于 2007-5-18 08:28 | 显示全部楼层

哈哈.自动移动声源的位置的时候,背心都麻了.

只有在移动的那个瞬间定位清楚.然后感觉声源是在后背.声源变换位置的时候,位置感最强.然后背心都麻了,呵呵.现在还没添加延时,耳廓什么模型的.只有一个头部的模型.
杨真人 发表于 2007-5-18 11:18 | 显示全部楼层

这个可真是高科技!

  
shashi5752 发表于 2007-6-2 23:02 | 显示全部楼层

不知所云

  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

15

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部