STC单片机PCA扩展外部中断程序

STC单片机PCA扩展外部中断程序,第1张

1、配置外部中断的触发模式:上沿、下沿、高电平、低电平;

2、中断允许位打开,中断总开关打开;

3、输入外部触发的引脚配老迹郑置好(有的单片机需要把端口改为外设端口,而不是普通输入口);

4、检查中断向量是否正侍颂确州坦。

程序说明:

y = pca(mixedsig),程序中mixedsig为 n*T 阶混合数据矩阵,n为信号个数,T为采样闹渗点数, y为 m*T 阶主分量矩阵。

程序设计步骤:

1、去均值

2、计算协方差矩阵及其特征值和特征向量

3、计算协方差矩阵的特征值大于阈值的个数

4、降序排列特征值

5、去掉较小的特征值

6、去掉较大的特征值(一般没有这一步扒数)

7、合并选择的特征值

8、选择相应的特征值和特征向量

9、计算白化矩阵

10、提取主分量

程序代码

%程序说明:y = pca(mixedsig),程序中mixedsig为 n*T 阶混合数据矩阵,n为信号个数,T为采样点数

% y为 m*T 阶主分量矩阵。

function y = pca(mixedsig)

if nargin == 0

error('You must supply the mixed data as input argument.')

end

if length(size(mixedsig))>2

error('Input data can not have more than two dimensions. ')

end

if any(any(isnan(mixedsig)))

error('Input data contains NaN''s.')

end

%——————————————去均值————————————

meanValue = mean(mixedsig')'

mixedsig = mixedsig - meanValue * ones(1,size(meanValue,2))

[Dim,NumofSampl] = size(mixedsig)

oldDimension = Dim

fprintf('Number of signals: %d\n',Dim)

fprintf('Number of samples: %d\n',NumofSampl)

fprintf('Calculate PCA...')

firstEig = 1

lastEig = Dim

covarianceMatrix = cov(mixedsig',1) %计算协方差矩阵

[E,D] = eig(covarianceMatrix) %计算协方差矩阵的特征值和特征向量

%———计算协方差矩阵的特征值大于阈值的个数lastEig———

rankTolerance = 1e-5

maxLastEig = sum(diag(D)) >rankTolerance

lastEig = maxLastEig

%——————————降序排列特征值——————————

eigenvalues = flipud(sort(diag(D)))

%—————————去掉较小的特征值——————————

if lastEig <oldDimension

lowerLimitValue = (eigenvalues(lastEig) + eigenvalues(lastEig + 1))/2

else

lowerLimitValue = eigenvalues(oldDimension) - 1

end

lowerColumns = diag(D) >lowerLimitValue

%—————去掉较大的特征值(一般没有这一步)——————

if firstEig >1

higherLimitValue = (eigenvalues(firstEig - 1) + eigenvalues(firstEig))/2

else

higherLimitValue = eigenvalues(1) + 1

end

higherColumns = diag(D) <higherLimitValue

%—————————合并选择的特征值——————————

selectedColumns =lowerColumns &higherColumns

%—————————输出处理的结果信息———液此脊——————

fprintf('Selected[ %d ] dimensions.\n',sum(selectedColumns))

fprintf('Smallest remaining (non-zero) eigenvalue[ %g ]\n',eigenvalues(lastEig))

fprintf('Largest remaining (non-zero) eigenvalue[ %g ]\n',eigenvalues(firstEig))

fprintf('Sum of removed eigenvalue[ %g ]\n',sum(diag(D) .* (~selectedColumns)))

%———————选择相应的特征值和特征向量———————

E = selcol(E,selectedColumns)

D = selcol(selcol(D,selectedColumns)',selectedColumns)

%——————————计算白化矩阵———————————

whiteningMatrix = inv(sqrt(D)) * E'

dewhiteningMatrix = E * sqrt(D)

%——————————提取主分量————————————

y = whiteningMatrix * mixedsig

%——————————行选择子程序———————————

function newMatrix = selcol(oldMatrix,maskVector)

if size(maskVector,1)~ = size(oldMatrix,2)

error('The mask vector and matrix are of uncompatible size.')

end

numTaken = 0

for i = 1:size(maskVector,1)

if maskVector(i,1) == 1

takingMask(1,numTaken + 1) == i

numTaken = numTaken + 1

end

end

newMatrix = oldMatrix(:,takingMask)

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lillllllll/archive/2010/02/21/5315382.aspx


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12302343.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存