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_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。这是如何找到的FpassFstop(稍微放宽这些要求可能会很有用。)

%% 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 回答