2013-04-08 160 views
1

我正在设计一个项目,其中一个阵列通过quadrature amplitude modulation(QAM)调制器,然后进行载波调制,使其可以与sound()命令一起使用,然后解调回到QAM解调。载波调制和解调中的低通滤波器

首先,我已经使用QAM调制的标准方式:到目前为止

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; 

没有问题:

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

然后,我写我自己的载波调制功能。但是当我完成解调功能后,我发现结果与原始值(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

作为一个附注,您可以丢失for循环并利用Matlab的向量化语法。这条单行'A1 = x。* sin(2 * pi * fc * t);'将会得到和你的整个循环一样的'A1'。 – Dan 2013-04-09 11:03:27

+0

@丹谢谢你的建议,这是我的第一个matlab程序 – 2013-04-09 13:09:55

+0

np,但是如果你希望得到低通滤波器的帮助,你需要展示一些尝试去理解低通滤波器是什么以及如何方法设计一个。这里的人会帮助你使用代码,但他们不会为你编码。另外如果你的问题是如何设计LPF你可能想尝试dsp.stackexchange而不是... – Dan 2013-04-09 13:34:04

回答

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; 

Demodlation是直截了当...

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

+0

你是我的生活保护者,非常感谢你!!!!我希望我可以给你更多的声誉.. :) – 2013-04-10 18:13:22

+0

关于你的(现在删除的)评论:你是对的。我意外地在调制中互换了'I'和'Q',并在解调中忘记了余弦前的负号。我纠正了我的怒气。 – Deve 2013-04-10 19:16:37

+0

我已经自己解决了这个问题,谢谢!另一个问题:代码中的FG变量是什么?为什么它会失败,如果我设置fs = 44000,fc = 11000和rs = 11000? – 2013-04-10 21:06:59