Matlab:处理高阶 QAM 信号时出错 - 矩阵维数必须一致
Matlab: Error when working with higher order QAM signal - Matrix dimension must agree
这个问题看似微不足道,但在尝试解决时却让我摸不着头脑。我正在尝试将具有恒定模数技术的分数间隔均衡器应用于 64 QAM 星座。该程序适用于 QPSK 或 4 QAM,但当我将其应用于 64QAM 时,它会抛出错误:
Error using /
Matrix dimensions must agree.
Error in Working_FSE_CMA_64QAM (line 68)
sb1=sb/(fh(temp)); % scale the output
我没有 Communications 工具箱,所以使用我在上一个问题中给出的答案生成了 64QAM 符号
有人可以帮助使代码工作吗?谢谢。
% Blind channel estimation/equalization
% adpative CMA method in Fractional space
T=1000; % total number of data
dB=25; % SNR in dB value
%%%%%%%%% Simulate the Received noisy Signal %%%%%%%%%%%
N=5; % smoothing length N+1
Lh=5; % channel length = Lh+1
Ap=4; % number of subchannels or receive antennas
h=randn(Ap,Lh+1)+sqrt(-1)*randn(Ap,Lh+1); % channel (complex)
for i=1:Ap, h(i,:)=h(i,:)/norm(h(i,:)); end % normalize
s = (randi(8,1,T)*2-5)+j*(randi(8,1,T)*2-5); %64 QAM
%s=round(rand(1,T))*2-1; % QPSK or 4 QAM symbol sequence
%s=s+sqrt(-1)*(round(rand(1,T))*2-1);
% generate received noisy signal
x=zeros(Ap,T); % matrix to store samples from Ap antennas
SNR=zeros(1,Ap);
for i=1:Ap
x(i,:)=filter(h(i,:),1,s);
vn=randn(1,T)+sqrt(-1)*randn(1,T); % AWGN noise (complex)
vn=vn/norm(vn)*10^(-dB/20)*norm(x(i,:)); % adjust noise power
SNR(i)=20*log10(norm(x(i,:))/norm(vn)); % Check SNR of the received samples
x(i,:)=x(i,:)+vn; % received signal
end
SNR=SNR % display and check SNR
%%%%%%%%%%%%% adaptive equalizer estimation via CMA
Lp=T-N; %% remove several first samples to avoid 0 or negative subscript
X=zeros((N+1)*Ap,Lp); % sample vectors (each column is a sample vector)
for i=1:Lp
for j=1:Ap
X((j-1)*(N+1)+1:j*(N+1),i)=x(j, i+N:-1:i).';
end
end
e=zeros(1,Lp); % used to save instant error
f=zeros((N+1)*Ap,1); f(N*Ap/2)=1; % initial condition
%R2=2; % constant modulas of QPSK symbols
R2 = 1.380953; %For 64 QAM http://www.google.com/patents/US7433400
mu=0.001; % parameter to adjust convergence and steady error
for i=1:Lp
e(i)=abs(f'*X(:,i))^2-R2; % instant error
f=f-mu*2*e(i)*X(:,i)*X(:,i)'*f; % update equalizer
f(N*Ap/2)=1;
% i_e=[i/10000 abs(e(i))] % output information
end
%sb=f'*X; % estimate symbols (perform equalization)
sb = filter(f, 1, X);
% calculate SER
H=zeros((N+1)*Ap,N+Lh+1); temp=0;
for j=1:Ap
for i=1:N+1, temp=temp+1; H(temp,i:i+Lh)=h(j,:); end % channel matrix
end
fh=f'*H; % composite channel+equalizer response should be delta-like
temp=find(abs(fh)==max(abs(fh))); % find the max of the composite response
sb1=sb/(fh(temp)); % scale the output
sb1=sign(real(sb1))+sqrt(-1)*sign(imag(sb1)); % perform symbol detection
start=N+1-temp; % general expression for the beginning matching point
sb2=sb1(10:length(sb1))-s(start+10:start+length(sb1)); % find error symbols
SER=length(find(sb2~=0))/length(sb2) % calculate SER
if 1
subplot(221),
plot(s,'o'); % show the pattern of transmitted symbols
grid,title('Transmitted symbols'); xlabel('Real'),ylabel('Image')
axis([-2 2 -2 2])
subplot(222),
plot(x,'o'); % show the pattern of received samples
grid, title('Received samples'); xlabel('Real'), ylabel('Image')
subplot(223),
plot(sb,'o'); % show the pattern of the equalized symbols
grid, title('Equalized symbols'), xlabel('Real'), ylabel('Image')
subplot(224),
plot(abs(e)); % show the convergence
grid, title('Convergence'), xlabel('n'), ylabel('Error e(n)')
end
主要问题是迭代算法不收敛(或者更具体地说发散)。结果 f
中的值包含 NaN
。结果
temp=find(abs(fh)==max(abs(fh)))
是一个空向量,因此与行
上的预期标量大小不匹配
sb1=sb/(fh(temp)); % scale the output
要解决此问题,您可能会注意到您使用的 mu
和 R2
的值基于具有单位方差的信号星座。您可以生成这样一个 64-QAM 星座:
s = ((randi(8,1,T)*2-9)+j*(randi(8,1,T)*2-9))/sqrt(42); %64 QAM
另外,有几行重新定义了复常量 j=sqrt(-1)
以用作索引变量。您应该避免使用 j
作为索引。此外,在您的脚本开始时清除所有变量(clear all
)可以帮助您以一致的干净状态开始执行。
这个问题看似微不足道,但在尝试解决时却让我摸不着头脑。我正在尝试将具有恒定模数技术的分数间隔均衡器应用于 64 QAM 星座。该程序适用于 QPSK 或 4 QAM,但当我将其应用于 64QAM 时,它会抛出错误:
Error using /
Matrix dimensions must agree.
Error in Working_FSE_CMA_64QAM (line 68)
sb1=sb/(fh(temp)); % scale the output
我没有 Communications 工具箱,所以使用我在上一个问题中给出的答案生成了 64QAM 符号
有人可以帮助使代码工作吗?谢谢。
% Blind channel estimation/equalization
% adpative CMA method in Fractional space
T=1000; % total number of data
dB=25; % SNR in dB value
%%%%%%%%% Simulate the Received noisy Signal %%%%%%%%%%%
N=5; % smoothing length N+1
Lh=5; % channel length = Lh+1
Ap=4; % number of subchannels or receive antennas
h=randn(Ap,Lh+1)+sqrt(-1)*randn(Ap,Lh+1); % channel (complex)
for i=1:Ap, h(i,:)=h(i,:)/norm(h(i,:)); end % normalize
s = (randi(8,1,T)*2-5)+j*(randi(8,1,T)*2-5); %64 QAM
%s=round(rand(1,T))*2-1; % QPSK or 4 QAM symbol sequence
%s=s+sqrt(-1)*(round(rand(1,T))*2-1);
% generate received noisy signal
x=zeros(Ap,T); % matrix to store samples from Ap antennas
SNR=zeros(1,Ap);
for i=1:Ap
x(i,:)=filter(h(i,:),1,s);
vn=randn(1,T)+sqrt(-1)*randn(1,T); % AWGN noise (complex)
vn=vn/norm(vn)*10^(-dB/20)*norm(x(i,:)); % adjust noise power
SNR(i)=20*log10(norm(x(i,:))/norm(vn)); % Check SNR of the received samples
x(i,:)=x(i,:)+vn; % received signal
end
SNR=SNR % display and check SNR
%%%%%%%%%%%%% adaptive equalizer estimation via CMA
Lp=T-N; %% remove several first samples to avoid 0 or negative subscript
X=zeros((N+1)*Ap,Lp); % sample vectors (each column is a sample vector)
for i=1:Lp
for j=1:Ap
X((j-1)*(N+1)+1:j*(N+1),i)=x(j, i+N:-1:i).';
end
end
e=zeros(1,Lp); % used to save instant error
f=zeros((N+1)*Ap,1); f(N*Ap/2)=1; % initial condition
%R2=2; % constant modulas of QPSK symbols
R2 = 1.380953; %For 64 QAM http://www.google.com/patents/US7433400
mu=0.001; % parameter to adjust convergence and steady error
for i=1:Lp
e(i)=abs(f'*X(:,i))^2-R2; % instant error
f=f-mu*2*e(i)*X(:,i)*X(:,i)'*f; % update equalizer
f(N*Ap/2)=1;
% i_e=[i/10000 abs(e(i))] % output information
end
%sb=f'*X; % estimate symbols (perform equalization)
sb = filter(f, 1, X);
% calculate SER
H=zeros((N+1)*Ap,N+Lh+1); temp=0;
for j=1:Ap
for i=1:N+1, temp=temp+1; H(temp,i:i+Lh)=h(j,:); end % channel matrix
end
fh=f'*H; % composite channel+equalizer response should be delta-like
temp=find(abs(fh)==max(abs(fh))); % find the max of the composite response
sb1=sb/(fh(temp)); % scale the output
sb1=sign(real(sb1))+sqrt(-1)*sign(imag(sb1)); % perform symbol detection
start=N+1-temp; % general expression for the beginning matching point
sb2=sb1(10:length(sb1))-s(start+10:start+length(sb1)); % find error symbols
SER=length(find(sb2~=0))/length(sb2) % calculate SER
if 1
subplot(221),
plot(s,'o'); % show the pattern of transmitted symbols
grid,title('Transmitted symbols'); xlabel('Real'),ylabel('Image')
axis([-2 2 -2 2])
subplot(222),
plot(x,'o'); % show the pattern of received samples
grid, title('Received samples'); xlabel('Real'), ylabel('Image')
subplot(223),
plot(sb,'o'); % show the pattern of the equalized symbols
grid, title('Equalized symbols'), xlabel('Real'), ylabel('Image')
subplot(224),
plot(abs(e)); % show the convergence
grid, title('Convergence'), xlabel('n'), ylabel('Error e(n)')
end
主要问题是迭代算法不收敛(或者更具体地说发散)。结果 f
中的值包含 NaN
。结果
temp=find(abs(fh)==max(abs(fh)))
是一个空向量,因此与行
上的预期标量大小不匹配sb1=sb/(fh(temp)); % scale the output
要解决此问题,您可能会注意到您使用的 mu
和 R2
的值基于具有单位方差的信号星座。您可以生成这样一个 64-QAM 星座:
s = ((randi(8,1,T)*2-9)+j*(randi(8,1,T)*2-9))/sqrt(42); %64 QAM
另外,有几行重新定义了复常量 j=sqrt(-1)
以用作索引变量。您应该避免使用 j
作为索引。此外,在您的脚本开始时清除所有变量(clear all
)可以帮助您以一致的干净状态开始执行。