通过J2ME的录音功能实现简易示波器

2017-07-17 21:25:19来源: 21ic 关键字:J2ME  录音功能  简易示波器

早就有人通过PC声卡的输入(麦克风孔)来做模拟示波器,但是用手机来实现的比较少。用J2ME的MMAPI实现模拟示波器,具体效果稍逊于智能机,因为智能机可以实时读取麦克风输入流,而J2ME还需要有短暂的缓冲构成了阻塞,不过,实现出来玩一下还是足够了。

先贴出效果图:

左图是程序在WTK运行的结果,右图是Audition读取音频输入口的波形,信号源是一个经过信号放大的压力传感器。

程序使用NetBeans + LWUIT类库,接下来贴出全部代码:


  1. import com.sun.lwuit.Command;  

  2. import com.sun.lwuit.Display;  

  3. import com.sun.lwuit.Form;  

  4. import com.sun.lwuit.events.ActionEvent;  

  5. import com.sun.lwuit.events.ActionListener;  

  6. import com.sun.lwuit.layouts.BorderLayout;  

  7. import java.io.ByteArrayOutputStream;  

  8. import javax.microedition.media.Manager;  

  9. import javax.microedition.media.Player;  

  10. import javax.microedition.media.control.RecordControl;  

  11.   

  12. /** 

  13.  * @author 张国威 

  14.  */  

  15. public class Frm_MainMenu extends javax.microedition.midlet.MIDlet implements ActionListener {  

  16.     public Form form ;  

  17.     private  Command cmdExit = new Command("退出", 1);  

  18.     private ThreadReceive threadReceive =new ThreadReceive();//接收数据线程  

  19.     private Cmp_Wave cmp_HeartWave=null;  

  20.     private Player capturePlayer = null;  

  21.     private RecordControl recordControl = null;  

  22.     private ByteArrayOutputStream bos = new ByteArrayOutputStream();  

  23.     public void startApp() {  

  24.         Display.init(this);  

  25.           

  26.         form = new Form();//达到全屏的效果  

  27.         cmp_HeartWave=new Cmp_Wave(form.getHeight(),form.getWidth());  

  28.         form.getStyle().setBgImage(null);//本窗体不需要背景  

  29.         form.addCommand(cmdExit);  

  30.         form.setCommandListener(this);  

  31.         form.setLayout(new BorderLayout());  

  32.         //设置画板控件  

  33.         form.addComponent(BorderLayout.CENTER,cmp_HeartWave);//添加控件  

  34.         form.show();  

  35.         try {  

  36.           capturePlayer = Manager.createPlayer("capture://audio?rate=8000&bits=8&channels=1");//PCM,8位,8kH  

  37.           if (capturePlayer != null) {  

  38.             capturePlayer.realize();  

  39.             recordControl = (RecordControl) capturePlayer  

  40.                 .getControl("javax.microedition.media.control.RecordControl");  

  41.             if (recordControl == null)  

  42.               throw new Exception("No RecordControl available");  

  43.             recordControl.setRecordStream(bos);  

  44.           } else {  

  45.             throw new Exception("Capture Audio Player is not available");  

  46.           }  

  47.         } catch (Exception e) {}  

  48.         threadReceive.start();//开始启动线程  

  49.   }  

  50. /* 

  51.  * byte转为int的函数,因为JAVA的byte范围从-127~127 

  52.  */  

  53. public static int unsignedByteToInt(byte b) {  

  54.     return (int) b & 0xFF;  

  55.     }  

  56. class ThreadReceive extends Thread {  

  57.       private boolean isRuning=true;//默认线程内部while循环可以执行  

  58.       public void StopThread()  

  59.       {  

  60.           isRuning=false;  

  61.       }  

  62.       public void run(){  

  63.           //*************************************************************  

  64.           //绘制波形数据  

  65.           //*************************************************************  

  66.           try {  

  67.               capturePlayer.start();  

  68.               while(isRuning)  

  69.               {  

  70.                   recordControl = (RecordControl) capturePlayer.getControl("javax.microedition.media.control.RecordControl");  

  71.                   recordControl.setRecordStream(bos);  

  72.                   recordControl.startRecord();  

  73.                   Thread.sleep(25);//停顿25ms录音  

  74.                   recordControl.stopRecord();  

  75.                   recordControl.commit();  

  76.                   //由于采集频率太高,手机不能完全显示,所以需要通过均值滤波来降低分辨率  

  77.                   int Zoom_out=200;//缩小200倍  

  78.                   int[] bits=new int[bos.toByteArray().length/Zoom_out];  

  79.                   for(int i=0,total=0,index=0;i

  80.                   {  

  81.                       total=total+unsignedByteToInt(bos.toByteArray()[i]);  

  82.                       if(i%Zoom_out==0 && i!=0)  

  83.                       {  

  84.                           bits[index]=total/Zoom_out;  

  85.                           total=0;  

  86.                           index++;  

  87.                       }  

  88.                   }  

  89. cmp_HeartWave.UpdateVerticalWave(bits);

[1] [2]

关键字:J2ME  录音功能  简易示波器

编辑:什么鱼 引用地址:http://www.eeworld.com.cn/Test_and_measurement/article_2017071719477.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:为什么示波器波形放大之后会有锯齿?
下一篇:玩不好触发,就不算会用示波器

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利
推荐阅读
全部
J2ME
录音功能
简易示波器

小广播

独家专题更多

东芝在线展会——芯科技智社会创未来
东芝在线展会——芯科技智社会创未来
2017东芝PCIM在线展会
2017东芝PCIM在线展会
TI车载信息娱乐系统的音视频解决方案
TI车载信息娱乐系统的音视频解决方案
汇总了TI汽车信息娱乐系统方案、优质音频解决方案、汽车娱乐系统和仪表盘参考设计相关的文档、视频等资源
电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2017 EEWORLD.com.cn, Inc. All rights reserved