使用FFT从调制信号中提取特定频率

时间:2013-02-05 17:08:17

标签: java fft dft

我使用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);
}

有人可以帮助代码吗?

1 个答案:

答案 0 :(得分:0)

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

可能计算量较小的另一种DSP技术是对两个频率进行正交解调,并在将结果馈送到同步逻辑和位检测器之前对结果进行低通滤波。另一种可能性是两个滑动Goertzel滤波器。