将x中从第p位开始的n个(二进制)位设置为y中最右边n位的值,x的其余各位保持不变

这篇博客介绍了一个C语言函数setbits(),该函数根据指定位置和长度,将x中的二进制位替换为y的最右边n位,同时保持x的其他位不变。通过示例和代码解析了函数的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     源自《The C Programming Language》P40 pr2-6:

 

     编写一个函数setbits(x, p, n, y),该函数返回对x执行下列操作后的结果值:将x中从第p位开始的n个(二进制)位设置为

     y中最右边n位的值,x的其余各位保持不变。

 

     代码:

    

clear; close all; N = 256; % 子载波数(OFDM符号大小) Divides_V = 4; % 分割子序列数 M = 100; % 最大符号数 Phases = 4; % 相数 SNR = 0:2:20; % 信噪比范围 cp_len = 64; % 循环前缀长度 PAPR_ori = zeros(1,M); PAPR_pts = zeros(length(Divides_V),M); best_Choose_idx = zeros(length(Divides_V),M); % 初始化误码率数组 BER_org = zeros(1, length(SNR)); BER_PTS = zeros(1, length(SNR)); BER3_with_clipping = zeros(1, length(SNR)); BER4_with_clipping = zeros(1, length(SNR)); % 生成PTS方法中所有可能的相因子组合集合 P_set = exp(1i*(pi/2:pi/2:2*pi)); Choose_Len = 4^5; % PTS方法中因子组合总数或IFFT数 X = zeros(5,Choose_Len); for i = 1:5 X(i,1:4^i) = [ones(1,4^(i-1)),repmat(2,1,4^(i-1)),repmat(3,1,4^(i-1)),repmat(4,1,4^(i-1))]; Y = X(i,1:4^i); X(i,1:4^5) = repmat(Y,1,4^(5-i)); end Choose = fliplr(X.'); for snr = 1:length(SNR) % 初始化错误bit数组 bit_errors_org = 0; bit_errors_PTS = 0; total_bits = 0; for nSymbol = 1:M Index = randi([0 1],1,M*N*4); reshaped_bits = reshape(Index, 4, []).'; decimal_symbols = bi2de(reshaped_bits); %调制 X1 = qammod(decimal_symbols,16); %IFFT ifft_data= ifft(X1.'); % 加入循环前缀 x_o = [ifft_data(end-cp_len+1:end), ifft_data]; x_Power_o = abs(x_o.^2); Peak_Power_o = max(x_Power_o,[],2); Mean_Power_o = mean(x_Power_o,2); PAPR_ori(1,nSymbol) = 10*log10(Peak_Power_o./Mean_Power_o); % PTS 部分传输序列 for nDivides = 1:length(Divides_V) Divides = Divides_V(nDivides); % 伪随机分割 XA = zeros(Divides,N); Index1= randperm(N); for nV=1:Divides XA(nV,Index1(nV:Divides:N)) = X1(Index1(nV:Divides:N)); end % Index是1:SC的随机置换后的序列,使等间隔分割变为任意分割 xa = ifft(XA,[],2); %PTS信号IFFT %加入循环前缀 min_value = 10; % 设初 for nC=1:4^Divides temp_P = P_set(Choose(nC,(6-Divides):5)).'; temp_P_sc = repmat(temp_P,1,N); temp_max = max(abs(sum(xa.*temp_P_sc))); if temp_max<min_value min_value = temp_max; best_nC = nC; end end best_Choose_idx(nDivides,nSymbol) = best_nC; best_P = P_set(Choose(best_nC,(6-Divides):5)).'; xaa1 = su
最新发布
03-12
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值