基于匹配滤波和线性调频理论的纸币识别算法
宋晓骥 王伟 杨彦赟 赵同晖
(国防科学技术大学电子科学与工程学院,长沙,410072)
摘 要:本文基于随机信号
分析
定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析
与处理的相关理论,提出了一种纸币识别的数学模型。在此基础上,运用匹配滤波器和线性调频信号的理论,开发了一种简易而可靠的纸币识别算法。
关键词:随机信号分析 匹配滤波器 线性调频信号
Abstract: Based on the random signal analysis and processing theory, a note recognition mathematical model is put forward. On this basis, using matched filter theory and LFM signals, we develop a simple and reliable note recognition algorithm.
Key words: Random signal analysis Matched filter Chirp signal
0 引言
纸币识别算法大多是基于模式识别的相关理论,从考量模式相似性的角度开发的。本文提出了一种纸币识别的数学模型,将纸币识别问题归结为在噪声中的信号检测问题,可以运用匹配滤波器和线性调频信号的理论完成识别。
1 匹配滤波器
如图所示线性系统,设系统的传递函数为,
输入波形为
(1)
其中是确知信号,是零均值平稳随机过程,功率谱密度为。
当
(2)
时,输出信噪比达到最大。如果噪声是白噪声,这时的滤波器称为匹配滤波器。
2 线性调频信号
线性调频信号是通过非线性相位调制或线性频率调制(LFM)来获得大的时宽带宽积的信号。线性调频信号可以
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
示为:
(3)
式中:A为信号幅度; 为矩形函数。
3 数学建模及理论分析
3.1 纸币识别问题的数学模型
在纸币识别问题中,共有100元,50元,20元和10元4种面额的纸币,每种纸币有新旧两个版本,每张纸币有4种扫描的方式。因此,等效共有32个面需识别。每一个面的数据是由8个传感器采集到的,以8×60的矩阵的形式呈现的,为此建立了数学模型:
模型假定存在“理想”的纸币,“理想”纸币各面的特征是唯一确知的信号,设这个信号为s(t)。而实际的纸币由于污损、环境等原因,往这个信号中引入了噪声N(t)。设加入噪声后,信号变为:
(4)
因此,传感器采集到的是一个随机序列X[n]:
(5)
X[n]包括8维度的特征,每个特征序列包含60个数据点。
因为s[n]对应的纸币的类别已知,如果检测出X[n]中含有信号s[n],那么就说明X[n]对应的纸币类别与s[n]对应的相同,这样就实现了纸币识别。
3.2运用匹配滤波和线性调频信号理论提高识别准确率
采用上述模型,纸币识别问题可以归结为噪声中信号检测的问题。信噪比越大,检测效果越好,因此可以采用匹配滤波器和线性调频信号来提高信噪比,以改善检测效果。识别过程可以用下图表示。
图1 识别过程
4 工程实现
算法流程图如图2所示。
结束
图2 总体流程图
4.1数据预处理算法
数据预处理的任务,首先是由训练样本得出对“理想”纸币特征的估计,即得到s[n]。 采用了取中值的方法获得这些特征:把所有样本中同一面值、同一面、同一传感器、同一维的数据排序,取中值作为“理想”纸币相应的特征值。这样有效地避免了噪声的影响,可以得到较准确的估计。
然后,将s[n]与线性调频信号序列C[n]相乘,获得调制后的信号h[n];将采样得到的序列x[n]与同一线性调频信号序列C[n]相乘,得到X[n]。
4.2 分类识别算法
样本的每个特征被视作一个随机序列X[n]。设引入的噪声N[n]为白噪声,
(6)
s[n]是实序列,所以匹配滤波器的冲击响应为
(7)
将序列X[n]与h[n]做卷积
(8)
把c[n]的最大值与门限值比较,就可以检测出X[n]中是否存在信号s[n]。
s[n]
根据匹配滤波理论,c[n]在n=60处取最大值,只需要计算c[60]即可。
在(7)式中,取C=1,k=60,h[n]就是s[n]的逆序序列,那么:
(9)
这样,就把复杂的卷积运算化为简单的乘加运算,极大地提高了效率。
4.3算法性能
测试样本共有320个,每种币值的纸币80个样本。
面额
100
50
20
10
误判数
0
0
0
0
拒判数
1
2
0
0
漏警概率
0
0
0
0
虚警概率
0.0125
0.025
0
0
检测概率
0.9875
0.975
1
1
总检测概率为:0.99。
5 结论
本文运用随机信号分析的理论,提出了一种简易而又有效的纸币识别算法。这种算法具有坚实的理论基础和简单的数学运算,实用性较高。
但是,本算法也存在一些缺点,比如存储“理想”纸币特征需要较大的空间,虚警概率较高等。
改进
方案
气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载
可以对“理想”纸币进行更精确的估计,获得准确的匹配滤波器;对噪声精确建模,更好消除噪声影响等。
参考文献
[1] 罗鹏飞,张文明.随机信号分析与处理[M].北京:清华大学出版社,2006.
[2] 朱华,黄辉宁.随机信号分析[M].北京:北京理工大学出版社,1990.
[3] 张笑天,杨奋强,Matlab7.x教程[M].西安:西安电子科技大学出版社,2005
6 附录(附关键程序代码)
void mul(int b,int c)
{
int i,j;
for(i=0;i<32;i++)
for(j=0;j<480;j++)
dat[b][i][j]=dat[c][i][j]*LFM[j];
}
void mul2(int b,int c,int i)
{ int j;
for(j=0;j<480;j++)
dat[b][i][j]=dat[c][i][j]*LFM[j];
}
void PiPeiLvBoQi(int m,int k,int c)
{
int i,j,e;
double sum=0.0;
for(e=0;e<8;e++)
{
sum=0.0;
for(j=0;j<8;j++)
{
for(i=0;i<60;i++)
{
sum+=dat[1][k][i+60*j]*dat[c][8*m+e][i+j*60];
}
max[e+k*8]=sum;
}
}
}
void PiPeiLvBoQi2(int m,int k)
{
int i,e;
double sum=0.0;
for(e=0;e<8;e++)
{
sum=0.0;
for(i=0;i<480;i++)
{
sum+=dat[1][k][i]*dat[2][8*m+e][i];
}
max[e+k*8]=sum;
}
}
double pingjun(int k,int j,int b)
{
int i;
double temp1=0.0;
for(i=0;i<60;i++)
temp1+=dat[b][k][j*60+i];
return temp1/60;
}
void guiyihua(int k,int b)
{
double temp=0.0,t=0.0,m=0.0;
int j,i;
for(i=0;i<8;i++)
{
for(j=0;j<60;j++)
{ m=pingjun(k,i,b);
temp=dat[b][k][j+60*i]-m;
dat[b][k][j+60*i]=temp;
t+=temp*temp;
}
t = sqrt(t);
for(j=0;j<60;j++)
{
dat[b][k][j+60*i]=dat[b][k][j+60*i]/t;
}
}
}
void panduan(int m,int k)
{
int j;
double temp = 0.0;
double temax=0.0;
for(j=0;j<8;j++)
{
if((max[k*8+j]>gate)&&(max[k*8+j]>=temax))//
{
temax=max[k*8+j];
f=1;
v=j+8*m;
}
}
}
void CMyDlg::OnButtons()
{ cleardat(1);
int i,j,m;
// TODO: Add your control notification handler code here
UpdateData(TRUE);
gate=m_W*8;
n=m_N;
m_SYS="打开文件中~";
m_OUT="";
m_D="";
UpdateData(FALSE);
CFileDialog open1(TRUE);
open1.DoModal();
string strfilename1; //打开文件
strfilename1=open1.GetFileName();
ifstream loadfile;
loadfile.open(strfilename1.c_str());
if(!loadfile)
{
m_SYS="文件加载失败!请重新输入。";
UpdateData(FALSE);
AfxMessageBox("文件加载失败!请重新输入!");
UpdateData(FALSE);
return;
}
else
{
m_SYS="文件加载成功!";
UpdateData(FALSE);
}
for(i=0;i<15360;i++)
{
loadfile>>dat[1][i/480%32][i%480];
if(!loadfile)
break;
}
/*itoa(dat[count+1][2][2],tbuf,10);
m_OUT=tbuf;
UpdateData(FALSE);*/
/////////////////// 输入 ///////////////////
/*for (i=0;i
dmax)
{
dmax=d[j];
m=j;
}
}
switch(m)
{
case 0:{m_OUT+="100元\r\n";break;}
case 1:{m_OUT+="50元\r\n";break;}
case 2:{m_OUT+="20元\r\n";break;}
case 3:{m_OUT+="10元\r\n";break;}
}
// ZaiPanDuan(m,r,n,i);
guiyihua(i,1);
if(1)
{
PiPeiLvBoQi(m,i,0);
panduan(m,i);
}
else
{
mul2(1,1,i);
PiPeiLvBoQi2(m,i);
panduan(m,i);
}
if(f==0)
m_D+="不识别\r\n";
else
switch(v)
{
case 0:{m_D+="100元A面\r\n";break;}
case 1:{m_D+="100元B面\r\n";break;}
case 2:{m_D+="100元C面\r\n";break;}
case 3:{m_D+="100元D面\r\n";break;}
case 4:{m_D+="100元E面\r\n";break;}
case 5:{m_D+="100元F面\r\n";break;}
case 6:{m_D+="100元G面\r\n";break;}
case 7:{m_D+="100元H面\r\n";break;}
case 8:{m_D+="50元A面\r\n";break;}
case 9:{m_D+="50元B面\r\n";break;}
case 10:{m_D+="50元C面\r\n";break;}
case 11:{m_D+="50元D面\r\n";break;}
case 12:{m_D+="50元E面\r\n";break;}
case 13:{m_D+="50元F面\r\n";break;}
case 14:{m_D+="50元G面\r\n";break;}
case 15:{m_D+="50元H面\r\n";break;}
case 16:{m_D+="20元A面\r\n";break;}
case 17:{m_D+="20元B面\r\n";break;}
case 18:{m_D+="20元C面\r\n";break;}
case 19:{m_D+="20元D面\r\n";break;}
case 20:{m_D+="20元E面\r\n";break;}
case 21:{m_D+="20元F面\r\n";break;}
case 22:{m_D+="20元G面\r\n";break;}
case 23:{m_D+="20元H面\r\n";break;}
case 24:{m_D+="10元A面\r\n";break;}
case 25:{m_D+="10元B面\r\n";break;}
case 26:{m_D+="10元C面\r\n";break;}
case 27:{m_D+="10元D面\r\n";break;}
case 28:{m_D+="10元E面\r\n";break;}
case 29:{m_D+="10元F面\r\n";break;}
case 30:{m_D+="10元G面\r\n";break;}
case 31:{m_D+="10元H面\r\n";break;}
}
UpdateData(FALSE);
}
return ;
}