Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion .idea/gradle.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 5 additions & 2 deletions .idea/modules.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 0 additions & 12 deletions .idea/runConfigurations.xml

This file was deleted.

16 changes: 12 additions & 4 deletions app/build.gradle
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
apply plugin: 'com.android.application'

android {
compileSdkVersion 26
compileSdkVersion 28
defaultConfig {
applicationId "sound.xwh.communication"
minSdkVersion 15
targetSdkVersion 26
minSdkVersion 16
targetSdkVersion 28
versionCode 1
versionName "1.0"
}
Expand All @@ -19,5 +19,13 @@ android {

dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:26.1.0'
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:2.0.4'
}

android {
packagingOptions
{
exclude'META-INF/DEPENDENCIES'
}
}
48 changes: 31 additions & 17 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,23 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest package="xwh.sound"
xmlns:android="http://schemas.android.com/apk/res/android">
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="xwh.sound">

<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<application

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:usesCleartextTraffic="true"
android:theme="@style/AppTheme">
<activity
android:name=".webpage"
android:exported="false">
<meta-data
android:name="android.app.lib_name"
android:value="" />
</activity>
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

</manifest>
81 changes: 69 additions & 12 deletions app/src/main/java/xwh/sound/CodeBook.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
package xwh.sound;

import android.util.Log;
/**
* 编码字典表
* 用声音频率来表达不同的字符,理想的做法是每个字符对应一段指定频率的声音。但是声音容易被干扰,只能采用划分大的频率段的方式进行编码。
Expand All @@ -13,25 +13,37 @@

public class CodeBook {

public static final int CODE_BOOK_LENGTH_CONTENT = 8; // 内容编码长度 (0-7为内容)
public static final int DUPLICATE_INDEX_1 = CODE_BOOK_LENGTH_CONTENT; // 重复标记1
public static final int DUPLICATE_INDEX_2 = DUPLICATE_INDEX_1 +1; // 重复标记2
public static final int START_INDEX = DUPLICATE_INDEX_2 + 1; // 开始标记
public static final int END_INDEX = START_INDEX + 1; // 结束标记

public static int CODE_BOOK_LENGTH_CONTENT = 8; // 内容编码长度 (0-7为内容)
public static int DUPLICATE_INDEX_1 = CODE_BOOK_LENGTH_CONTENT; // 重复标记1
public static int DUPLICATE_INDEX_2 = DUPLICATE_INDEX_1 +1; // 重复标记2
public static int END_INDEX = DUPLICATE_INDEX_2 + 1; // 开始标记
public static int START_INDEX = END_INDEX + 1; // 结束标记

public static int SEP_INDEX = START_INDEX + 1; // 分割符

//public static int freqDistance = MainActivity.FREQ_DISTANCE; // 两个频率之间的间距
public static int START_INDEX_HAMMING = 4;
public static int END_INDEX_HAMMING = 6;
public static int DUPLICATE_INDEX_1_HAMMING = 5;
public static int DUPLICATE_INDEX_2_HAMMING = 7;
//public static int BASE_FREQ = MainActivity.BASE_FREQ;
//public static int START_FREQ_HAMMING = BASE_FREQ + freqDistance * START_INDEX_HAMMING;
//public static int END_FREQ_HAMMING = BASE_FREQ + freqDistance * END_INDEX_HAMMING;
//public static int DUP1_FREQ_HAMMING = BASE_FREQ + freqDistance * DUPLICATE_INDEX_1_HAMMING;
//public static int DUP2_FREQ_HAMMING = BASE_FREQ + freqDistance * DUPLICATE_INDEX_2_HAMMING;


/**
* 两个book字典码来组成下面每个字符的编码
*/
public final static String CONTENT_CODE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; // Base64编码


public static int[] freqsWave = new int[12]; // 将声音频率划分成12段,每一段表示一个字典码。

public static int freqDistance = 500; // 两个频率之间的间距
public static int[] freqsWave = new int[13]; // 将声音频率划分成12段,每一段表示一个字典码。

static {
for(int i=0; i<freqsWave.length; i++) {
freqsWave[i] = 5000 + freqDistance * i;
freqsWave[i] = MainActivity.BASE_FREQ + MainActivity.FREQ_DISTANCE * i;
}
}

Expand All @@ -43,6 +55,41 @@ public static int encode(int index) {
return freq;
}

public static int encode_74hamming(int index) {
if (index == START_INDEX_HAMMING) {
return MainActivity.BASE_FREQ+MainActivity.FREQ_DISTANCE * START_INDEX_HAMMING;
}
if (index == END_INDEX_HAMMING) {
return MainActivity.BASE_FREQ + MainActivity.FREQ_DISTANCE * END_INDEX_HAMMING;
}
if (index == MainActivity.BASE_FREQ + MainActivity.FREQ_DISTANCE * DUPLICATE_INDEX_1_HAMMING) {
return MainActivity.BASE_FREQ + MainActivity.FREQ_DISTANCE * DUPLICATE_INDEX_1_HAMMING;
}
if (index == MainActivity.BASE_FREQ + MainActivity.FREQ_DISTANCE * DUPLICATE_INDEX_2_HAMMING) {
return MainActivity.BASE_FREQ + MainActivity.FREQ_DISTANCE * DUPLICATE_INDEX_2_HAMMING;
}
int freq_idx = _inv_gray(index, 2);
return freqsWave[index];
}

private static int _gray(int value, int bitNum) {
value = value & ((1<<bitNum) - 1);
int res = 0;
for (int i = bitNum-1; i >= 0; i--) {
res += (((value >> i) & 0x1) ^ ((value >> (i + 1)) & 0x1)) << i;
}
return res;
}

private static int _inv_gray(int value, int bitNum) {
value = value & ((1<<bitNum) - 1);
int res = value & (1<<(bitNum-1));
for (int i = bitNum - 2; i >= 0; i--) {
res += (((value >> i) & 0x1) ^ ((res >> (i + 1)) & 0x1)) << i;
}
//Log.i("_inv_gray", "before: " + value + " after: " + res);
return res;
}

/**
* 从码库里面找到一个最相近的
Expand All @@ -52,7 +99,7 @@ public static int encode(int index) {
public static int decode(int fre) {
int index = -1;

if ( fre + freqDistance > freqsWave[0]) { // 太小的不要
if ( fre + MainActivity.FREQ_DISTANCE > freqsWave[0]) { // 太小的不要
int min = Integer.MAX_VALUE;
for(int i=0; i<freqsWave.length; i++) {
int distance = Math.abs(fre - freqsWave[i]);
Expand All @@ -64,4 +111,14 @@ public static int decode(int fre) {
}
return index;
}

public static int decode_hamming(int fre) {
int index = decode(fre);
//if (index == -1 || index >= START_INDEX_HAMMING) {
// return index;
//}
//index = _gray(index, 2);
if (index > DUPLICATE_INDEX_2_HAMMING) index = DUPLICATE_INDEX_2_HAMMING;
return index;
}
}
Loading