2013-04-08 162 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