11172_3_ANNEXD规范对扩散函数的介绍如下 :
The "Spreading Function"
Several points in the following description refer to the "spreading function". It is calculated by the following method:
tmpx =1.05 (j-i ),
Where i is the bark value of the signal being spread, j is the bark value of the band being spread into, and tmpx is a temporary variable.
x=8 minimum ((tmpx-0.5)2-2(tmpx-0.5),0)
Where x is a temporary variable, and minimum (a,b) is a function returning the more negative of a or b.
tmpy = 15.811389 + 7.5(tmpx+0.474) - 17.5(1.0+(tmpx+0.474)2)0.5
where tmpy is another temporary variable.
if (tmpy<-100) then {sprdngf (i,j)=0} else {sprdngf (i,j)=10(x+tmpy)/10 }
MP3将频域信号分成了63个partition, 心理声学模型II的讨论基本上都是基于partition讨论的. partition比critical band(23个critical band)划分更细. 提供了更精确的频带分辨率.
假设已经分割好了63个partition, 现在我们要获得这63个partition的中心频率
#define partition_num 63 // 63个partition
int cur_partition; // 当前焦点所在partition的index.
// 各个partition的bark. 那么到底什么是bark? 先不理会, 我们就假设每个partition都// 会有个bark用于衡量这个partition有多宽. 那么你可能立刻就想到”难道bark是指这个
// partition的频宽吗!”. 不是, 但bark跟频宽有一定的关系, 我们就先假设bark就是这个
// partition的频宽好了.
// cbval[x]: 第x个partition的”频宽”
int cbval[partition_num];
// 求各个partition的median bark.
for(cur_partition=0; cur_partition<partition_num; cur_partition++)
{
//如何求各个partition? MP3制定了一个表, 要从该表中读取各
//个partition的median bark. 暂时不讨论.
cbval[cur_partition] = '获得各个partition的中心频率且先不讨论!';
}
那么, 现在我们已经得到了各个partition的中心频率了. 我们需要计算某个partition对其他62个partition产生的影响(为了方便计算, 我们认为是某个partition对其他63个partition的影响, 这个partition对自己的影响当然是0了).
那么, 我们定义一个二维数组sprdngf[ partition_num ][ partition_num ];
int i, j;
for(i=0; i<partition_num; i++)
{
for(j=0; j<partition_num; j++)
{
tmpx = 1.05 * (cbval[i] - cbval[j]);
x = 8.0 * min( (tmpx-0.5)*(tmpx-0.5) - 2*(tmpx-0.5), 0 );
tmpy = 15.81139
+ 7.5*(tmpx+0.474)
- 17.5*sqrt( 1.0+(tmpx+0.474)*(tmpx+0.474) );
if(tmpy < -100)
sprdngf[i][j] = 0;
else
sprdngf[i][j] = pow(10, (x+tmpy)/10);
}
}
下面对扩散函数进行优化
int i, j;
double tmp1, tmp2;
for(i=0; i<partition_num; i++)
{
for(j=0; j<partition_num; j++)
{
tmpx = 1.05 * (cbval[i] - cbval[j]);
tmp1 = tmpx - 0.5;
x = 8.0 * min( tmp1*tmp1 - 2*tmp1, 0 );
tmp2 = tmpx + 0.474;
tmpy = 15.81139 + 7.5*tmp2 - 17.5*sqrt(1.0+tmp2*tmp2);
if(tmpy < -100)
{
sprdngf[i][j] = 0.0;
}
else
{
sprdngf[i][j] = pow(10, (x+tmpy)/10);
}
}
}
至此, 扩散函数计算完毕.(以上讨论都是基于44.1KHz)
那么这里仍然留有一个疑问, “median bark”到底是个什么东东? 之后再讨论