这里是这几天做的实验,在安卓上的软件程序主要参考《疯狂的安卓讲义》,电路中的一些东西参考的是HiJack项目中的电路。在这里,我真的突然感慨学好模电真的很重要。在没有参考HIJACK之前,我对这些音频信号手足无措。在这个小项目学习完后,我决定再重新学习模电,感觉这一次重温应该能让我这模电知识再上一个台阶。
下面我从几个方面记录一下自己的学习过程,给自己留个记录以后翻阅,也可以给大家一个参考;
1).耳机线的接口;
2).话筒和耳机的声音原理;
3).安卓中的程序编写
1.耳机接口问题
一般MP3中的耳机就真的是耳机,其中没有话筒,分为三段左声道、右声道、地。而我们的手机中原装的耳机是带有话筒的,这种耳机分为四段分别为左声道、右声道、地、MIC。就是这手机带的四段带话筒的耳机还不同,像国内的一些手机厂商和国外的厂商,这种耳机的地和MIC可能是对换了的。有条件的可以折几个测测就知道。
2.其实话筒接收的是振动信号,以些振动信号产生变化的电流,通过耳机接口传到手机里面的处理电路,最后被采样。所以,这里用以下电路,参考HIJACK中的,单片机用PWM来输出。
用的是1KHZ占空比为50%的PWM波,最后在安卓中保存话筒采集到的数据,用的是16bit单通道格式保存为PCM,显示的波形图如下:振动幅值都是最大的-32768,32767.
在手机播放500HZ的音频时,我在耳机中测到的输入波形如下图:C1即为在左声道测得的波形,Z1、Z2为放大后的。
从手机通过耳机到单片机的电路如下:
3.安卓中的程序主要是涉及两个模块,一个是音频的录放,另一个就是文件的存储;
程序如下:APK编写的时候是支持android2.3.1以上的,大家可以在资源里下载http://download.csdn.net/detail/raoqin/5884203
界面文件main.xml
[java] view
plaincopy
-
"1.0" encoding="utf-8"?>
-
"fill_parent" android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent">
-
-
android:text="开始边录边放"
-
android:layout_width="fill_parent" android:id="@+id/btnRecord">
-
android:layout_width="fill_parent"
-
android:text="停止" android:layout_height="wrap_content">
-
android:layout_height="wrap_content"
-
android:id="@+id/btnExit" android:text="退出">
-
"@+id/TextView01" android:layout_height="wrap_content"
-
android:layout_width="fill_parent" android:text="程序音量调节">
-
"fill_parent" android:id="@+id/skbVolume"
-
android:layout_height="wrap_content">
-
"match_parent" android:layout_height="wrap_content"
-
android:id="@+id/tableRow1">
-
android:layout_height="wrap_content"
-
android:layout_width="wrap_content" android:text="读">
-
android:layout_height="wrap_content"
-
android:layout_width="wrap_content" android:text="写">
-
-
"EditText" android:id="@+id/edit1"
-
android:layout_width="match_parent" android:layout_height="wrap_content">
-
"match_parent" android:hint="EditText"
-
android:id="@+id/edit2" android:layout_height="wrap_content">
-
-
主程序如下:
[java] view
plaincopy
-
package packname.test;
-
-
-
import java.io.BufferedReader;
-
import java.io.File;
-
import java.io.FileInputStream;
-
import java.io.FileOutputStream;
-
import java.io.IOException;
-
import java.io.InputStreamReader;
-
import java.io.PrintStream;
-
import java.io.RandomAccessFile;
-
-
import android.app.Activity;
-
import android.media.AudioFormat;
-
import android.media.AudioManager;
-
import android.media.AudioRecord;
-
import android.media.AudioTrack;
-
import android.media.MediaRecorder;
-
import android.os.Bundle;
-
import android.os.Environment;
-
import android.view.View;
-
import android.widget.Button;
-
import android.widget.EditText;
-
import android.widget.SeekBar;
-
import android.widget.Toast;
-
-
public class acti extends Activity
-
{
-
-
-
final String FILE_NAME = "/myraoqin.bin";
-
File sdCardDir = null;
-
File targetFile = null;
-
RandomAccessFile raf = null;
-
-
Button btnRecord, btnStop, btnExit;
-
SeekBar skbVolume;
-
boolean isRecording = false;
-
static final int frequency = 44100;
-
static final int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO;
-
static final int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;
-
int recBufSize,playBufSize;
-
AudioRecord audioRecord;
-
AudioTrack audioTrack;
-
-
@Override
-
public void onCreate(Bundle savedInstanceState)
-
{
-
super.onCreate(savedInstanceState);
-
setContentView(R.layout.main);
-
setTitle("Lhyraoqin");
-
-
-
try
-
{
-
sdCardDir = Environment.getExternalStorageDirectory();
-
targetFile = new File(sdCardDir.getCanonicalPath() + FILE_NAME );
-
-
raf = new RandomAccessFile( targetFile, "rw" );
-
}
-