TrUSDXRig: Intial resampling RX streaming data

pull/67/head
Sunguk Lee 2023-08-07 05:29:40 +09:00
rodzic 98fc73ba75
commit c731f6e507
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 20A74A5D37EEA757
2 zmienionych plików z 47 dodań i 27 usunięć

Wyświetl plik

@ -78,14 +78,6 @@ public class BaseRigConnector {
//留给网络方式发送音频流
}
public void receiveWaveData(byte[] data){
float[] waveFloat=new float[data.length/2];
for (int i = 0; i <waveFloat.length ; i++) {
waveFloat[i]=readShortBigEndianData(data,i*2)/32768.0f;
}
receiveWaveData(waveFloat);
}
public void receiveWaveData(float[] data){
}
@ -111,17 +103,4 @@ public class BaseRigConnector {
public boolean isConnected(){
return connected;
}
/**
* Short
*
* @param data
* @param start
* @return Int16
*/
public static short readShortBigEndianData(byte[] data, int start) {
if (data.length - start < 2) return 0;
return (short) ((short) data[start] & 0xff
| ((short) data[start + 1] & 0xff) << 8);
}
}

Wyświetl plik

@ -28,6 +28,8 @@ public class TrUSDXRig extends BaseRig {
private boolean alcMaxAlert = false;
private boolean swrAlert = false;
private boolean rxStreaming = false;
private int rxSampling = 7812;
private int txSampling = 11520;
private TimerTask readTask() {
return new TimerTask() {
@ -124,9 +126,7 @@ public class TrUSDXRig extends BaseRig {
s = new String(remain);
if (rxStreaming) {
if (cutted.length > 0) {
getConnector().receiveWaveData(cutted);
}
onReceivedWaveData(cutted);
rxStreaming = false;
} else {
buffer.append(new String(cutted));
@ -162,9 +162,7 @@ public class TrUSDXRig extends BaseRig {
clearBufferData();
rxStreaming = true;
byte[] wave = Arrays.copyOfRange(remain, 2, remain.length);
if (getConnector() != null && wave.length > 0) {
getConnector().receiveWaveData(wave);
}
onReceivedWaveData(wave);
} else {
buffer.append(s);
}
@ -214,6 +212,36 @@ public class TrUSDXRig extends BaseRig {
}
}
public void onReceivedWaveData(byte[] data) {
if (data.length == 0) {
return;
}
if (getConnector() == null) {
return;
}
//float[] resampled = TrUSDXRig.resampler(data, rxSampling, 44000); // 44KHz
float[] resampled = TrUSDXRig.resampler(data, rxSampling, 12000); // 12KHz
getConnector().receiveWaveData(resampled);
}
static float[] resampler(byte[] data, int oldSampleRate, int newSampleRate) {
float rate = (float)newSampleRate / oldSampleRate;
int waveLength = data.length / 2;
int dataLength = (int)Math.ceil(waveLength * rate);
float[] resampled =new float[dataLength];
for (int i = 0; i < waveLength; i++) {
float f = readShortBigEndianData(data,i*2)/32768.0f;
int x = (int)Math.ceil(i * rate);
int y = (int)Math.ceil((i * rate) + rate);
int m = y - x;
for (int j = x; j < y && j < dataLength; j++) {
resampled[j] = (f * (j - x) / m) + (f * (m - (j - x) / m));
}
}
return resampled;
}
public TrUSDXRig() {
new Handler().postDelayed(new Runnable() {
@Override
@ -226,4 +254,17 @@ public class TrUSDXRig extends BaseRig {
},START_QUERY_FREQ_DELAY-500);
readFreqTimer.schedule(readTask(), START_QUERY_FREQ_DELAY,QUERY_FREQ_TIMEOUT);
}
/**
* Short
*
* @param data
* @param start
* @return Int16
*/
public static short readShortBigEndianData(byte[] data, int start) {
if (data.length - start < 2) return 0;
return (short) ((short) data[start] & 0xff
| ((short) data[start + 1] & 0xff) << 8);
}
}