【问题标题】:Low-pass filter in carrier modulation and demodulation载波调制解调中的低通滤波器
【发布时间】:2013-04-08 22:33:16
【问题描述】:

我正在设计一个项目,其中一个阵列通过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 添加到我的解调代码中,以使输出与原始代码相同?

【问题讨论】:

  • 附带说明,您可以丢失 for 循环并利用 Matlab 的矢量化语法。这条单行 A1=x.*sin(2*pi*fc*t); 将产生与整个循环相同的 A1
  • @Dan 感谢您的建议,这是我的第一个 matlab 程序
  • np,但是如果您希望获得有关低通滤波器的帮助,您需要尝试了解什么是低通滤波器以及如何设计一个低通滤波器。这里的人会帮助你编写代码,但他们不会为你编写代码。此外,如果您的问题是如何设计 LPF,您可能更想尝试 dsp.stackexchange...

标签: matlab signal-processing lowpass-filter


【解决方案1】:

相干解调后,您需要在接收器上安装一个低通滤波器,这是正确的。但是你的调制也有问题。在您的示例中,符号率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

【讨论】:

  • 你是我的救星,非常感谢!!!!希望我能给你更多的声誉.. :)
  • 关于您(现已删除)的评论:您是对的。我不小心在调制中互换了IQ,而在解调中忘记了余弦前面的减号。我已经更正了我的分析器。
  • 这个问题我已经自己解决了,谢谢!!另一个问题:代码中的 FG 变量是什么?如果我设置 fs=44000, fc=11000 和 rs=11000 为什么会失败?
  • 我使用fg作为基带信号的截止频率。但只是在评论中。设置fc = rs 可能会失败,原因有二:1)这里使用的脉冲整形器带宽很大,因此可能会出现基带重叠和不需要的支路。 2)当通带和阻带频率要关闭时,滤波器不能正常工作。您应该选择一个明显大于符号率的载波频率或使用另一个脉冲整形器(寻找升余弦)和/或另一个接收滤波器。
猜你喜欢
  • 2014-07-29
  • 1970-01-01
  • 2023-04-10
  • 2011-05-29
  • 2019-04-29
  • 2015-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多