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;
    }

明らかに、ゼロの場合は 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手法は、2つの周波数に対して直交復調を行い、結果を同期ロジックとビット検出器に供給する前に結果をローパスフィルター処理することです。さらに別の可能性は、2つのスライド式ゲルツェルフィルターです。

于 2013-02-05T17:22:27.010 に答える