1

配列が直交振幅変調(QAM) 変調器を通過し、キャリア変調を行い、sound()コマンドで再生可能にしてから、QAM 復調のために復調するプロジェクトを設計しています。

まず、QAM 変調の標準的な方法を使用しました。

M = 16;
x = randint(5000, 1, M);
y = modulate(modem.qammod(M), x);

次に、独自のキャリア変調関数を作成しました。

function [out] = carriermodulation(x)
fs = 16000;
T = 1.0 / 4000;
fc = 8000;
Q = real(x);
I = imag(x);
t = 0:T:(size(x))*T;
C1 = zeros(size(x), 1);
C2 = zeros(size(x), 1);
for i = 1:size(x)
    C1(i) = I(i)*sin(2*pi*(fc)*t(i));
    C2(i) = Q(i)*sin(2*pi*fc*t(i) + pi/2);
end

out = C1 + C2;

今のところ問題ありません。しかし、復調機能を使い終わったとき、結果が元の値 (QAM 変調器の出力) とは異なることがわかりました。

function [out] = carrierdemodulation(x)
fs = 16000;
T = 1.0 / 4000;
fc = 8000;
t = 0:T:(size(x))*T;
A1 = zeros( size(x), 1);
A2 = zeros( size(x), 1);
for i = 1:size(x)
    A1(i) = x(i)*sin( 2*pi*(fc)*t(i));
    A2(i) = x(i)*cos( 2*pi*(fc)*t(i));
end
A1 = sqrt(A1);
A2 = sqrt(A2);
out = A1 + A2;

私の変調部分は正しいと思います。唯一の問題は、復調用のローパス フィルター(LPF) がないことです。また、A1 と A2 を直接計算するべきではありません。出力がオリジナルと同じになるように、LPF を復調コードに追加するにはどうすればよいですか?

4

1 に答える 1

0

コヒーレント復調後の受信機にはローパスフィルターが必要ですね。しかし、変調にも問題があります。あなたの例では、シンボルレートRsは角搬送波周波数よりも低くw_c、受信機でスペクトルの重複を引き起こす可能性があります。その結果、情報信号の再構成は不可能になる。さらに、あなたの例ではfc * T = 2。これは、正弦関数の引数が 2pi の整数倍であるため、常にゼロであることを意味します。

必要なのは、帯域幅 の送信機にあるインパルス シェーパー (ローパス フィルターとして実装可能)w_g >= R/2です。いわゆるナイキストローパスである必要があります。キャリア周波数は を満たす必要がありw_c > w_gます。

送信信号を再構築できるように、インパルス整形、変調、復調、フィルタリング、およびサンプリングを行うMATLABスクリプトを作成しました。

まず、パラメータを定義し、ランダム ビットを作成して、既に行ったようにマッピングを行います。インパルス整形には非常に単純なインパルス応答、つまり矩形インパルスが使用されます。現実の世界では、ここでデジタルからアナログ ドメインに移行しますが、これはコンピューター モデルであるため、アナログ信号をサンプリング周波数 の離散信号で表しますf_sL各サンプル時間を繰り返すだけなので、インパルス シェーパーは単純です。

M = 16; % QAM order
fs = 16000; % Sampling frequency in Hz
Ts = 1/fs; % Sampling interval in s
fc = 1000; % Carrier frequency in Hz (must be < fs/2 and > fg)
Rs = 100; % Symbol rate
Ns = 20; % Number of symbols

x = randint(Ns, 1, M);
y = modulate(modem.qammod(M), x);

L = fs / Rs; % Oversampling factor

% Impulse shaping
y_a = reshape(repmat(y', L, 1), 1, length(y)*L);

さて変調。上記の条件を満たすキャリア周波数を使用しました。これは信号帯域幅よりも高く、使用したサンプリング周波数で表すことができます。

%% Modulation
I = real(y_a);
Q = imag(y_a);
t = 0 : Ts : (length(y_a) - 1) * Ts;
C1 = I .* sin(2*pi * fc * t);
C2 = Q .* cos(2*pi * fc * t);
s = C1 + C2;

復調は簡単です...

%% Demodulation
r_I = s .* sin(2*pi * fc * t);
r_Q = s .* -cos(2*pi * fc * t);

復調後にスペクトル支流を除去するには、2f_cローパス フィルターが必要です。MATLAB FDAToolを使用して、フィルターと次のコードの一部を作成しました。覚えておいてください: 信号帯域幅はRs/2で、不要な支流は から始まります2*fc - Rs/2FpassとはこうしてFstop見つけられる。(これらの要件を少し緩和すると役立つ場合があります。)

%% Filter

% Design filter with least-squares method
N     = 50;           % Order
Fpass = Rs/2;         % Passband Frequency
Fstop = 2*fc - Rs/2;  % Stopband Frequency
Wpass = 1;            % Passband Weight
Wstop = 1;            % Stopband Weight

% Calculate the coefficients using the FIRLS function.
b  = firls(N, [0 Fpass Fstop fs/2]/(fs/2), [1 1 0 0], [Wpass Wstop]);

% Filtering
w_I = filter(b, 1, r_I);
w_Q = filter(b, 1, r_Q);

フィルタリング後、受信信号をサンプリングする必要があります。ここでは単なるダウンサンプリングです。L/2フィルタの遷移を避けるために、位相オフセットを使用しました。

%% Sampling
u_I = downsample(w_I, L, L/2);
u_Q = downsample(w_Q, L, L/2);

最後に、コンスタレーション ダイアグラムをプロットして、適切な 16-QAM コンスタレーションを取得します。

plot(u_I, u_Q, '.');

完全なコードはここにあります

あなたの質問は、DSPと MATLAB プログラミングの両方の多くのトピックに触れました。どこも詳しく説明できませんでした。16-QAM の変調と復調について具体的な質問がある場合は、おそらく Stack Exchange サイトのSignal Processingを参照してください。

于 2013-04-10T15:41:02.997 に答える