TrUSDXRig: Apply resample

still return wrong RX streaming data
pull/67/head
Sunguk Lee 2023-08-07 14:42:57 +09:00
rodzic 262704af00
commit 40d4c06a65
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 20A74A5D37EEA757
2 zmienionych plików z 32 dodań i 35 usunięć

Wyświetl plik

@ -78,6 +78,15 @@ 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){
}
@ -103,4 +112,17 @@ 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

@ -11,6 +11,8 @@ import com.bg7yoz.ft8cn.R;
import com.bg7yoz.ft8cn.database.ControlMode;
import com.bg7yoz.ft8cn.ui.ToastMessage;
import com.jackz314.resample.Resample;
import java.io.ByteArrayOutputStream;
import java.util.Arrays;
import java.util.Timer;
@ -233,30 +235,16 @@ public class TrUSDXRig extends BaseRig {
}
rxStreamBuffer.write(data, 0, data.length);
if (rxStreamBuffer.size() >= 512 || force) {
byte[] wave = rxStreamBuffer.toByteArray();
rxStreamBuffer.reset();
float[] resampled = TrUSDXRig.resampler(wave, rxSampling, 48000); // 48KHz
//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));
Resample resample = new Resample(Resample.ConverterType.SRC_LINEAR, 1, rxSampling, 48000);
try {
byte[] resampled = resample.processCopy(rxStreamBuffer.toByteArray());
rxStreamBuffer.reset();
getConnector().receiveWaveData(resampled);
} finally {
resample.close();
}
}
return resampled;
}
public TrUSDXRig() {
@ -271,17 +259,4 @@ 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);
}
}