载波调制和解调中的低通滤波器

时间:2013-04-08 22:33:17

标签: matlab signal-processing lowpass-filter

我正在设计一个项目,其中一个数组通过quadrature amplitude modulation(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;

我认为我的调制部分是正确的。我认为我唯一的问题是我没有low-pass filter(LPF)进行解调。我不应该直接计算A1和A2。如何在解调代码中添加LPF,使输出与原始输出相同?

1 个答案:

答案 0 :(得分:0)

在相干解调后,您需要在接收器处使用低通滤波器,这是对的。但是你的调制也存在问题。在您的示例中,符号率Rs小于角度载波频率w_c,这可能导致接收器处的频谱重叠。因此,信息信号的重建将是不可能的。另外,在您的示例fc * T = 2中。这意味着正弦函数的参数是2pi的整数倍,因此总是为零。

您需要的是带宽为w_g >= R/2的发射机上的脉冲整形器(可以实现为低通滤波器)。它应该是所谓的Nyquist低通。载波频率必须满足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, '.');

您可以找到完整的代码here

你的问题触及了DSP和MATLAB编程的很多主题。我到处都无法详细说明。如果您对16-QAM调制和解调有特定问题,那么可能是Stack Exchange站点 Signal Processing