出处:http://blog.163.com/qiu_zhi2008/blog/static/60140977201262132339388/
在CC的系统芯片中都有数据白化功能.whiting的中文件直译为白化,真实的意思应该是数据加噪.
白化处理主要是为了避免在传输过程中出现过长的连续0或1的位流模式。基带处理器需要从接收到的模拟数据信号中判断数据是0还是1,但过长的连续0或1位流会造成问题。因为在接收到的模拟数据信号中并不存在象直流信号中那样的参考点,因此必须依靠接收到的最后几个传输信号进行校正。任何连续的0或1的长序列位流串都可能导致校正失败。因此需要采用数据白化技术对信号进行扰码处理,以大大降低出现长序列0或1位流串的可能性。
白化的原理:
Rx
很明显, Rx
Ry
上式的含义是:y的各分量是不相关的,即 E[yi
Rx
Q
B = Σ
Ry
因此,通过矩阵 B
E[yyT
图像数据的白化代码(matlab):
该pca函数接口形式为:
function [Y,V,E,D] = pca(X)
% do PCA on image patches
% INPUT variables:
% X
% OUTPUT variables:
% Y
% V
% E
% D
%去除直流成分
X = X-ones(size(X,1),1)*mean(X);
%其中r=size(A,1)该语句返回的时矩阵A的行数,c=size(A,2) 该语句返回的时矩阵A的列%数
% Calculate the eigenvalues and eigenvectors of the new covariance matrix.
covarianceMatrix = X*X'/size(X,2); % 求出其协方差矩阵
%E是特征向量构成,它的每一列是特征向量,D是特征值构成的对角矩阵
%这些特征值和特征向量都没有经过排序
[E, D] = eig(covarianceMatrix);
% Sort the eigenvalues
% 因为sort函数是升序排列,而需要的是降序排列,所以先取负号,diag(a)是取出a的对角元素构成
% 一个列向量,这里的dummy是降序排列后的向量,order是其排列顺序
[dummy,order] = sort(diag(-D));
E = E(:,order);%将特征向量按照特征值大小进行降序排列,每一列是一个特征向量
Y = E'*X;
d = diag(D); %d是一个列向量
%dsqrtinv是列向量,特征值开根号后取倒,仍然是与特征值有关的列向量
%其实就是求开根号后的逆矩阵
dsqrtinv = real(d.^(-0.5));
Dsqrtinv = diag(dsqrtinv(order));%是一个对角矩阵,矩阵中的元素时按降序排列好了的特征值(经过取根号倒后)
D = diag(d(order));%D是一个对角矩阵,其对角元素由特征值从大到小构成
V = Dsqrtinv*E';%特征值矩阵乘以特征向量矩阵
end
1.
求X的协方差矩阵,如下式:
C = X * X’;
对C进行奇异值分解,如下式:
C = U*D*U’;
式中D为特征值的对角阵,U为C的奇异值分解中的左奇异阵,U的各个分量u1,u2,...,um为C的特征向量。
观测数据阵X的白化过程如下:
Z = M * X;
上式中的M为白化矩阵,M = inv(sqrt(D)) * U',其中D极为X的协方差矩阵C的奇异值分解中的特征根对角阵。Z即为白化后的数据阵。
C语言代码:
unsigned short whiting_data(unsigned char *data, unsigned short whiting_pn9){
unsigned char i, c;
*data ^= (whiting_pn9&0xFF);
for(i=0; i<8; i++){
c = whiting_pn9 & 0x21;
whiting_pn9 >>= 1;
if ((c==0x21)||(c==0)){
whiting_pn9 &= 0x0FF;
}else{
whiting_pn9 |= 0x100;
}
}
return whiting_pn9;
}
// 数据串白化处理
void whiting_buff(unsigned char *buff, unsigned short len)
{
unsigned short whiting_pn9;
whiting_pn9 = 0x1FF;
while (len--){
whiting_pn9 = whiting_data(buff++, whiting_pn9);
}
}