0

我已经使用 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_LOW,为 1 发送 FREQUENCY_HIGH。

现在我如何使用 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);
}

有人可以帮忙写代码吗?

4

1 回答 1

0

您可以为 FFT 使用重叠的滑动窗口,窗口和 FFT 的长度与数据位的长度相同。然后在这些窗口的适当 FFT 结果箱中查找 1 和 0 的幅度峰值。您还需要一些同步逻辑来运行 1 和 0。

另一种计算密集度较低的 DSP 技术是对您的两个频率进行正交解调,然后对结果进行低通滤波,然后再将其馈送到同步逻辑和比特检测器。另一种可能性是两个滑动 Goertzel 滤波器。

于 2013-02-05T17:22:27.010 回答