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

+0

@ Dan은 UR 조언을 주셔서 감사합니다, 이것은 내 첫 matlab 프로그램 –

+0

np이지만, 저역 통과 필터에 대한 도움을 얻기를 원한다면, 저역 통과 필터가 무엇인지 이해하고 몇 가지 시도를 보여 주어야합니다 하나를 설계하는 접근법. 여기에있는 사람들은 코드를 사용하여 도움을 주지만 코드를 작성하지는 않습니다. 또한 귀하의 질문에 LPF를 설계하는 방법이라면 dsp.stackexchange를 시도해보십시오. – Dan

답변

0

코 히어 런트 복조 후 수신기에서 저역 통과 필터가 필요합니다. 하지만 변조에도 문제가 있습니다. 귀하의 예에서, 기호 속도 Rs은 각도 반송파 주파수 w_c보다 적 으면 수신기에서 스펙트럼이 겹칠 수 있습니다. 결과적으로, 정보 신호의 재구성이 불가능할 것이다. Additionaly, 귀하의 예에서 fc * T = 2. 즉, 사인 함수의 인수는 2pi의 정수배이므로 항상 0입니다.

대역폭이 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 변조 및 복조에 대한 질문이있는 경우 스택 교환 사이트가 아마도 Signal Processing 일 것입니다.

+0

당신은 내 생명의 은인 이니, 정말 고마워요 !!!! 나는 당신에게 더 많은 평판을 줄 수 있기를 바랍니다. :) –

+0

귀하의 (지금 삭제 된) 의견 : 귀하가 옳았습니다. 나는 우연히 변조에서 'I'와 'Q'를 교체했고 복조에서 코사인 앞에서 빼기 부호를 잊었다. 나는 앤서를 바로 잡았다. – Deve

+0

나는이 문제를 이미 스스로 해결하고있다. 고마워! 또 다른 질문 : 코드에서 FG 변수는 무엇입니까? 그리고 fs = 44000, fc = 11000 그리고 rs = 11000으로 설정하면 왜 실패하나요? –