二○○九~二○一○学年第二学期应用技术学院课程设计报告书课程名称:多媒体技术班级:09级网络工程学号:姓名:指导教师:二○一○年六月目录1.需求分析 (2)1.1课程设计题目 (2)1.2课程设计要求 (2)1.3系统功能需求分析 (2)2.概要设计 (3)3.详细设计 (4)3.1界面设计 (4)3.2行程编码设计 (11)4.程序调试 (14)4.1源文件的压缩 (14)4.2源文件的解压 (15)5.总结 (18)1.需求分析1.1课程设计题目信源与信道编/解码练习。
1.2课程设计要求1)要求利用程序设计软件(如VC、Java、Matlab)制作一个能完成信道编/解码(海明/CRC码),信源编/解码(如行程编码)软件。
2)基本要求为编制软件至少能根据所输入的数据完成信源、信道编解码,其中信道编码要求能产生1-2位随机错误,且能纠1位错,最后是能读取txt文件,或者直接读取图片来完成,如能对视频完成则更佳。
3)编写的软件编译后能直接运行,验证编/解码效果,否则无效。
1.3系统功能需求分析➢操作环境(软件、硬件及条件)Windws 9x/NT/2000/XP/2003NetBeans IDE 6.8➢系统功能此软件是在JAVA平台下编写的,能根据所输入的数据完成信道(海明码)、信源编解码(行程编码),其中信道编码(海明码)能产生1位随机错误,且能纠1位错,最后是能直接读取图片或txt文件来完成。
➢用户操作流程编码:解码:2.概要设计系统总体框架:3.详细设计本次课程设计中我主要负责界面设计和行程编码,故作以下详细介绍。
3.1界面设计界面设计如图3-1所示:图3-1界面设计代码如下:package DMTcode;import java.io.File;import javax.swing.JFileChooser;import javax.swing.JOptionPane;public class NewJFrame extends javax.swing.JFrame {int rndChooser;byte targetBit;private int i;File f1,f2;byte[] mybyte1,mybyte2;public NewJFrame() {initComponents();this.setTitle("重庆大学09网络工程尹力沈小波多媒体课程设计");}@SuppressWarnings("unchecked");private void initComponents() {jPanel1 = new javax.swing.JPanel();jButton1 = new javax.swing.JButton();jLabel1 = new javax.swing.JLabel();jTextField1 = new javax.swing.JTextField();jLabel2 = new javax.swing.JLabel();jTextField2 = new javax.swing.JTextField();jButton2 = new javax.swing.JButton();jButton4 = new javax.swing.JButton();jButton5 = new javax.swing.JButton();jPanel2 = new javax.swing.JPanel();jLabel3 = new javax.swing.JLabel();jLabel4 = new javax.swing.JLabel();jPanel3 = new javax.swing.JPanel();jLabel5 = new javax.swing.JLabel();jLabel6 = new javax.swing.JLabel();jLabel7 = new javax.swing.JLabel();jLabel8 = new javax.swing.JLabel();jButton3 = new javax.swing.JButton();jLabel9 = new javax.swing.JLabel();setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder("行程编码文件")); jButton1.setText("打开");jButton1.addActionListener(new java.awt.event.ActionListener() {public void actionPerformed(java.awt.event.ActionEvent evt) {jButton1ActionPerformed(evt);}});jLabel1.setText("源文件:");jTextField1.setEnabled(false);jLabel2.setText("目标文件:");jTextField2.setEnabled(false);jButton2.setText("保存");jButton2.addActionListener(new java.awt.event.ActionListener() {public void actionPerformed(java.awt.event.ActionEvent evt) {jButton2ActionPerformed(evt);}});jButton4.setText("开始编码");jButton4.addActionListener(new java.awt.event.ActionListener() {public void actionPerformed(java.awt.event.ActionEvent evt) {jButton4ActionPerformed(evt);}});jButton5.setText("开始解码");jButton5.addActionListener(new java.awt.event.ActionListener() {public void actionPerformed(java.awt.event.ActionEvent evt) {jButton5ActionPerformed(evt);}});javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);jPanel1.setLayout(jPanel1Layout);jPanel1Layout.setHorizontalGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout. Alignment.LEADING).addGroup(jPanel1Layout.createSequentialGroup().addGap(38, 38, 38).addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alig nment.LEADING, false).addGroup(javax.swing.GroupLayout.Alignment.TRAILING,jPanel1Layout.createSequentialGroup().addComponent(jLabel2).addPreferredGap(ponentPlacement.R ELATED).addComponent(jTextField2)).addGroup(jPanel1Layout.createSequentialGroup().addComponent(jLabel1).addPreferredGap(ponentPlacement.R ELATED).addComponent(jTextField1,javax.swing.GroupLayout.PREFERRED_SIZE, 174, javax.swing.GroupLayout.PREFERRED_SIZE))).addPreferredGap(ponentPlacement.RELATED, 103, Short.MAX_V ALUE).addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alig nment.TRAILING).addComponent(jButton2).addComponent(jButton1)).addGap(50, 50, 50).addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alig nment.LEADING).addComponent(jButton5).addComponent(jButton4)).addContainerGap(98, Short.MAX_V ALUE)));jPanel1Layout.setVerticalGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(jPanel1Layout.createSequentialGroup().addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alig nment.LEADING).addGroup(jPanel1Layout.createSequentialGroup().addGap(17, 17, 17).addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupL ayout.Alignment.BASELINE).addComponent(jLabel1).addComponent(jTextField1,javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)).addGap(7, 7, 7).addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupL ayout.Alignment.BASELINE).addComponent(jLabel2).addComponent(jTextField2,javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))).addGroup(jPanel1Layout.createSequentialGroup().addContainerGap().addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupL ayout.Alignment.BASELINE).addComponent(jButton1).addComponent(jButton4)).addPreferredGap(ponentPlacement.R ELATED).addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupL ayout.Alignment.BASELINE).addComponent(jButton5).addComponent(jButton2)))).addContainerGap(11, Short.MAX_V ALUE)));getContentPane().add(jPanel1, java.awt.BorderLayout.PAGE_START);jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder(" 文件信息"));jPanel2.setPreferredSize(new java.awt.Dimension(442, 40));jLabel3.setText("源文件大小:");jLabel4.setText("目标文件大小:");javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);jPanel2.setLayout(jPanel2Layout);jPanel2Layout.setHorizontalGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout. Alignment.LEADING).addGroup(jPanel2Layout.createSequentialGroup().addGap(29, 29, 29).addComponent(jLabel3).addPreferredGap(ponentPlacement.RELATED, 268, Short.MAX_V ALUE).addComponent(jLabel4).addGap(200, 200, 200)));jPanel2Layout.setVerticalGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Al ignment.LEADING).addGroup(jPanel2Layout.createSequentialGroup().addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alig nment.BASELINE).addComponent(jLabel3).addComponent(jLabel4)).addContainerGap(17, Short.MAX_V ALUE)));getContentPane().add(jPanel2, java.awt.BorderLayout.CENTER);jPanel3.setBorder(javax.swing.BorderFactory.createTitledBorder("海明编码信息"));jLabel6.setText("字节二进制编码:");jLabel7.setText("字节海明编码:");jLabel8.setText("随机出错:");jButton3.setText("校验");jButton3.addActionListener(new java.awt.event.ActionListener() {public void actionPerformed(java.awt.event.ActionEvent evt) {jButton3ActionPerformed(evt);}});jLabel9.setText("纠正:");javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3);jPanel3.setLayout(jPanel3Layout);jPanel3Layout.setHorizontalGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(jPanel3Layout.createSequentialGroup().addGap(26, 26, 26).addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alig nment.LEADING).addGroup(jPanel3Layout.createSequentialGroup().addComponent(jLabel7).addPreferredGap(ponentPlacement.R ELATED, 321, Short.MAX_V ALUE).addComponent(jLabel9).addGap(186, 186, 186)).addGroup(jPanel3Layout.createSequentialGroup().addComponent(jLabel8).addPreferredGap(ponentPlacement.R ELATED, 278, Short.MAX_V ALUE).addComponent(jButton3).addGap(232, 232, 232)).addGroup(jPanel3Layout.createSequentialGroup().addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupL ayout.Alignment.LEADING).addComponent(jLabel6).addComponent(jLabel5)).addContainerGap(531, Short.MAX_V ALUE)))));jPanel3Layout.setVerticalGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(jPanel3Layout.createSequentialGroup().addContainerGap().addComponent(jLabel5).addPreferredGap(ponentPlacement.RELATED).addComponent(jLabel6).addPreferredGap(ponentPlacement.RELATED).addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alig nment.BASELINE).addComponent(jLabel7).addComponent(jLabel9)).addPreferredGap(ponentPlacement.RELATED).addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alig nment.BASELINE).addComponent(jLabel8).addComponent(jButton3)).addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE,Short.MAX_VALUE)));getContentPane().add(jPanel3, java.awt.BorderLayout.SOUTH);pack();}// </editor-fold>private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {// TODO add your handling code here:JFileChooser chooser=new JFileChooser();chooser.showOpenDialog(jLabel1);jTextField1.setText(chooser.getSelectedFile().getPath().toString());jLabel3.setText("源文件大小:"+chooser.getSelectedFile().length()+"字节");f1=chooser.getSelectedFile();}private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {// TODO add your handling code here:JFileChooser chooser1=new JFileChooser();chooser1.showSaveDialog(jLabel1);f2=chooser1.getSelectedFile();jTextField2.setText(chooser1.getSelectedFile().getPath().toString());jLabel4.setText("目标文件大小:"+chooser1.getSelectedFile().length()+"字节");}private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {jLabel8.setText("随机出错:"+myOp.revertAndCheckhammingCode()[0]);jLabel9.setText("纠正:"+myOp.revertAndCheckhammingCode()[1]);}private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here:/*调用编码方法开始压缩文件*/if(jTextField1.getText()==null&&jTextField2.getText()==null){JOptionPane.showMessageDialog(null, "还没有设置文件呢!");}else{try{mybyte1=myOp.importFile(f1);mybyte2=myOp.zipCode(mybyte1);myOp.exportFile(f2, mybyte2);jLabel4.setText("目标文件大小:"+f2.length()+"字节");rndChooser=(int)(Math.random()*mybyte2.length);targetBit=mybyte2[rndChooser];jLabel5.setText("字节值:"+String.valueOf(targetBit));jLabel6.setText("字节二进制编码:"+myOp.hammingCode(targetBit)[0]);jLabel7.setText("字节海明编码:"+myOp.hammingCode(targetBit)[1]);}catch(Exception e){}}}private void jButton5ActionPerformed(java.awt.event.ActionEvent evt) { /*调用解码码方法开始解压文件*/if(jTextField1.getText()==null&&jTextField2.getText()==null){JOptionPane.showMessageDialog(null, "还没有设置文件呢!");}else{try{mybyte1=myOp.importFile(f1);mybyte2=myOp.unzipCode(mybyte1);myOp.exportFile(f2, mybyte2);jLabel4.setText("目标文件大小:"+f2.length()+"字节");rndChooser=(int)(Math.random()*mybyte2.length);targetBit=mybyte2[rndChooser];jLabel5.setText("字节值:"+String.valueOf(targetBit));jLabel6.setText("字节二进制编码:"+myOp.hammingCode(targetBit)[0]);jLabel7.setText("字节海明编码:"+myOp.hammingCode(targetBit)[1]);}catch(Exception e){}}}public static void main(String args[]) {java.awt.EventQueue.invokeLater(new Runnable() {public void run() {new NewJFrame().setVisible(true);}});}private javax.swing.JButton jButton1;private javax.swing.JButton jButton2;private javax.swing.JButton jButton3;private javax.swing.JButton jButton4;private javax.swing.JButton jButton5;private javax.swing.JLabel jLabel1;private javax.swing.JLabel jLabel2;private javax.swing.JLabel jLabel3;private javax.swing.JLabel jLabel4;private javax.swing.JLabel jLabel5;private javax.swing.JLabel jLabel6;private javax.swing.JLabel jLabel7;private javax.swing.JLabel jLabel8;private javax.swing.JLabel jLabel9;private javax.swing.JPanel jPanel1;private javax.swing.JPanel jPanel2;private javax.swing.JPanel jPanel3;private javax.swing.JTextField jTextField1;private javax.swing.JTextField jTextField2;}3.2行程编码设计由界面中的开始解码调用行程编码的函数,其代码如下:public static byte[] zipCode(byte[] mycode){byte[] tempArray=new byte[10000000];//构建一个足够大的临时数组;int[] lengthArray=new int[4];//临时的存位数长度的数组lengthArray[0]=-127;int i=1;int n=0;int mycount=1;do{if(mycode[i]==mycode[i-1]){mycount++;i++;}else{tempArray[n]=mycode[i-1];n++;if(mycount>127){tempArray[n]=(byte)lengthArray[0];n++;if((lengthArray[1]=mycount/127)>127){lengthArray[2]=lengthArray[1]/127;lengthArray[1]=127;tempArray[n]=(byte)lengthArray[1];n++;tempArray[n]=(byte)lengthArray[2];}else{tempArray[n]=(byte)lengthArray[1];n++;tempArray[n]=0;}n++;lengthArray[3]=mycount%127;tempArray[n]=(byte)lengthArray[3];}else{tempArray[n]=(byte)mycount;}mycount=1;n++;i++;}}while(i<mycode.length);if(i==mycode.length){tempArray[n]=mycode[i-1];n++;if(mycount>127){tempArray[n]=(byte)lengthArray[0];n++;if((lengthArray[1]=mycount/127)>127){lengthArray[2]=lengthArray[1]/127;lengthArray[1]=127;tempArray[n]=(byte)lengthArray[1];n++;tempArray[n]=(byte)lengthArray[2];}else{tempArray[n]=(byte)lengthArray[1];n++;tempArray[n]=0;}n++;lengthArray[3]=mycount%127;tempArray[n]=(byte)lengthArray[3];}else{tempArray[n]=(byte)mycount;}}byte[] result=new byte[n+1];//定义一个新数组,存放压缩后实际大小的图像文件for(int count=0;count<result.length;count++){result[count]=tempArray[count];}System.out.println("目前的字节是:"+result.length);return result;}public static byte[] unzipCode(byte[] myrecode){byte[] tempArray=new byte[10000000];int lengthBit;int n=0;for(int i=0;i<myrecode.length;){if(myrecode[i+1]==-127){if(myrecode[i+3]==0) myrecode[i+3]=1;lengthBit=myrecode[i+2]*myrecode[i+3]*127+myrecode[i+4];for(int l=0;l<lengthBit;l++){tempArray[n]=myrecode[i];n++;}i+=5;}else{for(int m=0;m<myrecode[i+1];m++){tempArray[n]=myrecode[i];n++;}i+=2;}}byte[] result=new byte[n+1];//定义一个新数组,存放压缩后实际大小的图像文件for(int count=0;count<result.length;count++){result[count]=tempArray[count];}System.out.println("解压后目前的字节是:"+result.length);JOptionPane.showMessageDialog(null, "解压成功!");return result;}4.程序调试我做的行程编码,只对其做了调试。