ber = sum(abs(demod_signal-bits))/n; 矩阵维度不一致,请重新编写
时间: 2024-05-13 17:16:07 浏览: 155
这个报错可能是因为 demod_signal 或 bits 的维度不一致,无法进行元素级别的 abs 和 sum 运算。你可以检查一下这两个变量的维度是否相同。
如果维度不同,你可以尝试使用 reshape 函数将它们变成相同的维度,例如:
```python
demod_signal = demod_signal.reshape(-1, 1)
bits = bits.reshape(-1, 1)
```
这样可以将 demod_signal 和 bits 变成列向量,然后进行运算。如果你想要进行行向量的运算,可以将 reshape 的参数改成 (1, -1)。
另外,你还需要检查一下 n 的值是否正确,它应该等于 demod_signal 或 bits 的长度。
```python
n = len(demod_signal)
ber = sum(abs(demod_signal-bits))/n;
```
这样就可以计算出误码率了。
相关问题
生成ofdm通信系统PAPR技术中的的限幅法,PTS,压扩变换的BER对比MATLAB代码
### OFDM 系统 PAPR 技术中的限幅法、PTS 和压扩变换 BER 对比 MATLAB 实现
#### 1. 概述
OFDM (Orthogonal Frequency Division Multiplexing) 是一种高效的数据传输技术,但在实际应用中,由于其信号峰值平均功率比(PAPR, Peak to Average Power Ratio)较高,可能会导致非线性失真等问题。为了降低PAPR并提高系统的性能,常用的几种方法包括:
- **限幅法**:直接对超过一定阈值的部分进行裁剪处理。
- **部分传输序列 (Partial Transmit Sequence, PTS)**:通过对数据块加权组合,并选择最优相位因子来减少峰均比。
- **压缩扩展变换 (Companding Transformation)**:利用特定函数映射输入信号,以达到减小动态范围的效果。
接下来将给出基于这三种方案下的误码率(BER, Bit Error Rate)比较Matlab仿真示例代码。
```matlab
% 参数设置
N = 64; % 子载波数
K = log2(N); % 编码长度
M = 8; % QAM调制阶数
SNR = -5:0.5:15; % SNR区间 [dB]
numSymbs = 1e3;
% 初始化结果变量
ber_clipping = zeros(length(SNR), 1);
ber_pts = zeros(length(SNR), 1);
ber_compand = zeros(length(SNR), 1);
for i=1:length(SNR)
snr_db = SNR(i);
%% Limting Method
% Generate OFDM signal with clipping technique.
data_in_clip = randi([0 M-1], K*numSymbs, 1);
modulated_signal_clip = qammod(data_in_clip,M,'UnitAveragePower',true);
ofdm_tx_clip = ifft(reshape(modulated_signal_clip,N,numSymbs));
clipped_ofdm_tx_clip = limit_amplitude(ofdm_tx_clip,max(abs(ofdm_tx_clip(:)))*0.7);
noisy_rx_clip = awgn(clipped_ofdm_tx_clip,snr_db,'measured');
recovered_modulated_signal_clip = fft(noisy_rx_clip);
demod_data_out_clip = qamdemod(recovered_modulated_signal_clip.',M,'UnitAveragePower',true);
ber_clipping(i)= biterr(data_in_clip,demod_data_out_clip)/length(data_in_clip);
%% Partial Transmit Sequences (PTS)
% Define parameters for PTS method
L=4;% number of subblocks
p=[exp(j*[-pi/4 pi/4 3*pi/4])]; % phase factors
% Perform PTS operation and generate corresponding OFDM signals
[data_in_pts,pts_ofdm_tx]=perform_PTS(K*L,p,numSymbs,M);
noisy_rx_pts=awgn(pts_ofdm_tx,snr_db,'measured');
recovered_modulated_signal_pts=fft(noisy_rx_pts);
[~,demod_data_out_pts]=qamdemod(recovered_modulated_signal_pts.',M,'UnitAveragePower',true);
ber_pts(i)=biterr(data_in_pts(:)',demod_data_out_pts(:))/prod(size(demod_data_out_pts));
%% Companding Transformation
% Apply mu-law compander on the transmitted symbols before IFFT processing.
alpha=0.5;
beta=log(M)/(log(alpha*M+1)-alpha*log((M-1)*(alpha*M+1)));
% Generating input bits & applying modulation scheme
data_in_com=randi([0 M-1],K*numSymbs,1);
modulated_symbols=qammod(double(data_in_com)+1,M,'UnitAveragePower',false);
compressed_symbols=compressSignal(modulated_symbols,alpha,beta);
% Formulate final transmit waveform after IDFT transformation.
tx_waveform=ifft(compressed_symbols.');
% Adding Gaussian Noise at receiver end.
rx_waveform=noiseAddition(tx_waveform,snr_db);
% De-compression followed by FFT processsing then DEMODULATION step.
uncompressed_symbols=decompressSignal(rx_waveform.',alpha,beta);
received_symbols=fft(uncompressed_symbols.');
dec_bits=qamdemod(real(received_symbols).',M,'UnitAveragePower',false)-1;
ber_compand(i)=biterr(uint8(data_in_com'),dec_bits)/length(dec_bits);
end
figure();
semilogy(SNR,[ber_clipping, ber_pts, ber_compand],'LineWidth',2);
title('BER Performance Comparison Among Clipping , PTS And Mu-Law Companding For OFDM System')
xlabel('SNR[dB]')
ylabel('Bit Error Probability ')
legend({'Clipping','PTS','Mu-Law Companding'}, 'Location','bestoutside')
grid minor;
function y=limit_amplitude(x,a_max)
y=a_max.*sign(real(x)).*min(a_max./abs(x),ones(size(x))).*(real(x)+j*imag(x));
end
function [outputData,outputWaveform] = perform_PTS(blockSize,phaseFactors,symbolsPerSubblock,QAMOrder)
totalSymbols=length(symbolsPerSubblock)*size(phaseFactors,2);
inputBits=repmat(randi([0 QAMOrder-1],[symbolsPerSubblock*size(phaseFactors,2)]),[QAMOrder]);
tx_waveforms=zeros(totalSymbols/blockSize,size(inputBits,2));
for k=1:size(inputBits,2)
temp_input=inputBits(:,k);
reshapedInput=reshape(temp_input,[],length(phaseFactors)).';
weightedInputs=sum(bsxfun(@times,qammod(reshapedInput+1,QAMOrder,...
'UnitAveragePower',false),...
exp(-j*(0:blockSize-length(phaseFactors):blockSize-1).'...
*angle(phaseFactors))),2)./sqrt(QAMOrder);
outputWaveform(:,k)=ifft(weightedInputs.');
end
outputData=inputBits(:)';
end
function out=compressSignal(signal,alpha,beta)
out=(signal.*(beta/log(alpha*max(abs(signal))+1))-...
((signal.^2).*log(max(abs(signal))))/(2*log(alpha*max(abs(signal))+1))) .* sign(signal);
end
function out=addNoise(waveform,desired_snr_dB)
noise_var=(var(waveform))/(10^(desired_snr_dB/10));
noised_waveform=sqrt(var(waveform))*randn(size(waveform)).* sqrt(noise_var)+waveform;
out=noised_waveform;
end
function out=decompressSignal(signal,alpha,beta)
exponent_term=(2*log(alpha*max(abs(signal))+1))./...
(((signal.^2).*log(max(abs(signal))))+(signal.*beta));
out=((exponent_term./(2*log(alpha*max(abs(signal))+1))).^(-1)).
*(signal-(beta./log(alpha*max(abs(signal))+1)));
end
```
此段MATLAB程序实现了针对不同类型的PAPR削减技术——即“削波”、“分部传送序列(PTS)”以及"mu律压扩”的误码性能评估实验平台建设工作。通过改变信噪比参数`SNR`,可以得到相应条件下各算法下接收端估计出比特错误概率的变化曲线图。
编写m文件实现制定内容的仿真
对于仿真的内容而言,具体实现的过程和方法会根据具体的需要而有所不同。下面我以一个简单的例子来说明如何编写一个MATLAB的m文件实现数字信号的调制和解调的基本仿真。
1. 编写数字信号生成函数
在MATLAB中,可以使用sinc函数生成一个正弦波载波,再将其与数字信号相乘实现ASK调制。下面是一个简单的数字信号生成函数的例子:
```
function [t, s] = generate_signal(f0, fs, bits)
% f0: 载波频率
% fs: 采样频率
% bits: 待调制的数字信号序列
T = length(bits) / fs;
t = 0:1/fs:T-1/fs;
carrier = sin(2 * pi * f0 * t);
s = bits .* carrier;
end
```
2. 编写ASK调制函数
可以通过将数字信号与载波相乘实现ASK调制,假设数字信号的值为0或1,则当数字信号为0时,ASk调制后的信号为0,当数字信号为1时,ASK调制后的信号为载波信号。下面是一个简单的ASK调制函数的例子:
```
function [t, s_mod] = ASK_modulation(f0, fs, bits)
% f0: 载波频率
% fs: 采样频率
% bits: 待调制的数字信号序列
[t, s] = generate_signal(f0, fs, bits);
s_mod = s .* (bits + 1);
end
```
3. 编写AWGN信道模型函数
在数字频带通信过程中,信号会受到信道噪声的影响。可以使用AWGN函数生成高斯分布的噪声,再将其与待传输信号相加模拟AWGN信道效应。下面是一个简单的AWGN信道模型函数的例子:
```
function s_rx = AWGN_channel(s_tx, SNR)
% s_tx: 待传输的信号
% SNR: 信噪比
P_signal = sum(s_tx.^2) / length(s_tx); % 计算信号的平均功率
P_noise = P_signal / 10^(SNR/10); % 计算噪声的平均功率
noise = sqrt(P_noise) * randn(size(s_tx)); % 生成高斯噪声
s_rx = s_tx + noise; % 加入噪声
end
```
4. 编写ASK解调函数
解调的过程是将接收到的信号与载波信号相乘,再使用低通滤波器滤除高频成分,得到数字信号。下面是一个简单的ASK解调函数的例子:
```
function bits_rx = ASK_demodulation(f0, fs, s_rx)
% f0: 载波频率
% fs: 采样频率
% s_rx: 接收到的信号
T = length(s_rx) / fs;
t = 0:1/fs:T-1/fs;
carrier = sin(2 * pi * f0 * t);
s_demod = s_rx .* carrier;
[b, a] = butter(5, 2 * f0 / fs);
s_filtered = filter(b, a, s_demod);
bits_rx = s_filtered > 0.5;
end
```
通过调用上述函数,可以完成数字信号的调制、传输、接收和解调的仿真。例如,可以使用下面的代码生成一个长度为100的随机数字信号,将其进行ASK调制、AWGN信道传输、ASK解调,最后计算误比特率:
```
f0 = 1000; % 载波频率
fs = 10e3; % 采样频率
bits = randi([0, 1], 1, 100); % 随机数字信号
[t, s_mod] = ASK_modulation(f0, fs, bits);
s_rx = AWGN_channel(s_mod, 20);
bits_rx = ASK_demodulation(f0, fs, s_rx);
BER = sum(bits_rx ~= bits) / length(bits);
```
以上就是一个简单的数字信号调制和解调的仿真实现,可以根据实际需要进行调整和扩展。
阅读全文
相关推荐













