我使用FSK用我的数据调制了载波频率信号,如下所示:
double SAMPLING_TIME = 1.0 / 441000 // 44khz
int SAMPLES_PER_BIT = 136;
int ENCODING_SAMPLES_PER_BIT = SAMPLES_PER_BIT / 2;
int duration = ENCODING_SAMPLES_PER_BIT * SAMPLING_TIME;
public double[] encode(int[] bits) {
for (int i = 0; i < bits.length; i++) {
int freq = FREQUENCY_LOW;
if (bits[i] > 1)
freq = FREQUENCY_HIGH;
bitArray = generateTone(freq, duration);
message = bitArray;
}
return message;
}
private double[] generateTone(int frequency, double duration) {
int samplingRate = 1/SAMPLING_TIME; // Hz
int numberOfSamples = (int) (duration * samplingRate);
samplingTime = 2 * SAMPLING_TIME;
double[] tone = new double[numberOfSamples];
for (int i = 0; i < numberOfSamples; i++) {
double y = Math.sin(2 * Math.PI * frequency * i * SAMPLING_TIME);
tone[i] = y * CARRIER_AMPLITUDE;
}
return tone;
}
显然,我正在为ZERO和FREQUENCY_HIGH发送FREQUENCY_LOW为1。
现在如何使用FFT对其进行解调?我有兴趣在整个时间内对FREQUENCY_LOW,FREQUENCY_HIGH的幅度(存在和不存在)进行采样。
我只知道FFT的基础知识,我开始写这个但是没有意义:
private void decode(byte[] tone, int length) {
float[] input = new float[FFT_SIZE*2]; // not sure what size? shouldn't this be buffer?
for(int i=0;i<length;i++){
input[i]=tone[i];
}
FloatFFT_1D fft = new FloatFFT_1D(FFT_SIZE);
fft.realForward(input);
}
有人可以帮助代码吗?
答案 0 :(得分:0)
您可以为FFT使用重叠滑动窗口,窗口和FFT的长度与数据位的长度相同。然后在这些窗口的相应FFT结果箱中查找1和0的幅度峰值。对于1和0的运行,您还需要一些同步逻辑。
可能计算量较小的另一种DSP技术是对两个频率进行正交解调,并在将结果馈送到同步逻辑和位检测器之前对结果进行低通滤波。另一种可能性是两个滑动Goertzel滤波器。