相干解调后,您需要在接收器处使用低通滤波器,这是正确的。但是你的调制也有问题。在您的示例中,符号率Rs
小于角载波频率w_c
,这可能会导致接收器处的频谱重叠。因此,信息信号的重构将是不可能的。另外,在您的示例fc * T = 2
中。这意味着正弦函数的参数是 2pi 的整数倍,因此始终为零。
你需要的是一个脉冲整形器(可以作为一个低通滤波器实现)在带宽为 的发射机上w_g >= R/2
。它应该是所谓的奈奎斯特低通。载波频率必须满足w_c > w_g
。
我编写了一个MATLAB脚本,它可以进行脉冲整形、调制、解调、滤波和采样,以便可以重建传输的信号。
首先,我们定义参数,创建随机位并按照您已经完成的方式进行映射。使用非常简单的脉冲响应来进行脉冲整形,即矩形脉冲。在现实世界中,我们在这里从数字域到模拟域,但由于这是一个计算机模型,我们用具有采样频率的离散信号来表示模拟信号f_s
。脉冲整形器很简单,因为它只是重复每个采样L
时间。
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/2
。这是如何找到的Fpass
。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。