链表_讨论帖

Seal^_^
云原生领域优质创作者
博客专家认证
2023-09-15 09:17:18

对于LinkedList描述错误的是:

默认会把元素添加到链表的第一个位置

...全文
15 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
clear all; close all; clc; % 最近同步技术里面有很多关于costas环的子,很多集中讨论环路滤波的,也有自己做了程序发出来。但都没有一个完整的结论和系统的有方向性的讨论点.最近做了一个simulink仿真.个人认为现有的所谓经典方法很难被别人掌握.因此,从锁相环的原理出发,结合现成的经典方法,做了这个仿真.说明一下: % 一个是高载频,一个是低载频的。低载频的我用的FIR代替的积分清零器,大家可以换成积分清零器件.阶数应该几阶就可以了。 % % 1:如果是没有进行成形滤波的数据,那么信息数据率不要太高,以防止在锁定 时间内发生极性翻转,这样就锁不住了。(说简单点就是信息数据对载波的调制作用引起的载波相位的突变.) % % 2.积分清零的目的是滤除倍频信号,在系统采样率(系统时钟)相对中频信号频率只是几倍关系时,积分清零阶数可以很低,几阶.原理在于数字频率对模拟频率的 归一化. % % 3.鉴相方式非常关键.将鉴频差和相差结合起来,是一个新的发现.这样可以很好的锁定.通过调整对应的两个控制增益,便可独立的控制相位和频率的锁定速度.相差(信号点所在的位置的相位)和频差(相位点旋转的方向和快慢)可以很直观的在星座图上看出来. % % 4.环路滤波器的输出进行积分操作,能够很好的把反馈送入NCO. % % 5.环路滤波器参数设置没什么新意思.阻尼0.707.噪声带宽25 % % 欢迎大家下回去琢磨,然后讨论!论坛空间也有限,想好了再把你的问题说出来,谢谢! % 阅过之后,更敢无新意,我的看法如下: % 1,costas loop在不同的应用场合(诸如,符号速率,动态应力,多谱勒,信道环境等等),其环路设计就会有非常大的差异. % 比如,在某些情况下,环路滤波的前或后,可能要进行环滤更新操作.以匹配NCO的需要.但通常的科环并不需要这样的设计等等. % 2,变型的科环很多,难以统一一种模式. % 3,经典的科环理论很重要,很多变型都是根据不同的应用进行改进的. % 切忌:想以一种仿真结论来定论所有形式的科环设计. % 同意楼上的。掌握一个跟踪环路的本质是重要的,光Costas环就有好多种,关键看你要应用在什么场合,实现复杂度有什么要求。 % 如果楼主想对costas环有点更深入的认识,建议考虑一下低SNR环境下或者高动态环境的载波跟踪这种例子可能会更有些帮助。这种情况下每一个环节的设计考虑就都不像你所说的那样简单了。至少不会有“环路滤波器参数设置没什么新意思.阻尼0.707.噪声带宽25”。 % 楼上两位说得很有道理,确实,针对不同的应用场合,环路的参数设置,滤波器的设计,鉴相方式,都会有所变化. % 我发这篇的目的,就是希望大家可以从costas环原理的角度,通过仿真,掌握各种参数,各个关键部分,对环的影响,从而真正掌握锁相环的设计方法.而不是每遇到新问题就失去了主动权,找不到北. % % 还希望大家够针对具体的锁相环的问题,各抒己见.不泛泛而谈,深入下去,发扬我们大家的研学精神! % gardner定时同步算法是一种适合高速信号的 % 反馈式算法,它只需要每符号两个采样点,且载波 % 相位误差不影响算法的定时性能,鉴于以上优点, % 该算法适合多种应用场合。 % % 它是从平方律定时推导出的,依靠检测码元转换处的 % 过零点来定时,因此数字基带信号的归零特性很大程度 % 上影响算法的性能,一般升余弦滤波器成型的数字波形 % 在码元转换点是不归零的,使码元转换点归零,一般使用 % 模拟系统中针对平方律定时的预滤波方法,理论和实践证明 % 这种方法是有效的,几乎可以消除定时抖动。 % % 这里分享我找到的有关gardner算法的一些文章,基本涵盖了 % 各个放面的内容,包括算法原文,算法性能分析,算法的应用 % 和改进方面的文章 % 锁相环有几个体现捕捉性能的参数: % 对于无源滤波二阶环路 % 捕捉带=4*sqrt(K*阻尼因子*环路自然角频率) % 快捕带= 4*阻尼因子*环路自然角频率 %% % 对于二阶环 % 根据带宽与阻尼系数的关系 % 一般取阻尼系数为0.707 % 剩下的就是确定环路带宽了 % 当然要确定最终的k1k2,鉴相或者鉴频增益也是很重要的 % GPS的跟踪,一般采用数字锁相环的结构. 环路等效噪声带宽的设计数字环路的一个重要参数, %该参数影响着环路的收敛速度,跟踪精度,以及环路可收敛的输入频差范围等, 反过来带宽的设计也由这些因素决定. % % 5楼给的数值应该分别是载波锁相环环路噪声带宽, 锁频环的噪声带宽以及码环的噪声带宽. %通过噪声带宽可以求出环路滤波器的参数,(通常限定在3阶环路以下), 具体方法可以参考书籍: % GPS原理及应用 第一, 二版, 还有一本是fundamentals of global positonging system receiver % 这两本书比较适合初学者. % 经常有师弟师妹问我怎样学习LDPC码,现在我将个人学习LDPC码的心得写在下面,以供参考。 % 1. 了解LDPC码的基本概念(主要是校验矩阵与Tanner图的关系)之后,学习LDPC码的和积译码算法。这里建议首先用概率测度推出无环图下,变量节点和校验节点消息的更新公式,透彻理解“消息”、“更新”和“传递”的含义。 % 2. 看LDPC码和积译码算法的程序。要点在双循环链表、两个消息更新的计算步骤(检验节点和变量节点运算,也叫水平步骤和垂直步骤)。(c 程序可以在网上Mackey的网站下,我这也有)。 % 3. 对LDPC码的和积译码算法充分理解之后,可以看密度进化理论及其高斯逼近算法,推倒文章中的公式是很有助于理解和积译码算法的。 % 4.经过步骤3,我们应该对什么样的LDPC码性能会好有一个初步的理解,这样我们可以试着设计 LDPC码。(高斯逼近和密度进化程序我这也有) % 5.理解信道编码定理和Turbo原理,“码长”“随机”“迭代译码“”对于一个实用好码很重要。 % 另外,在这之前最好弄清楚信噪比,编码速率,BER和FER的含义。 %% gardner 位同步测试程序 %% M.Moeneclaey提出的数控方法 %% m(k+1)-m(k)=int[Ti/Ts+uk]; %% u(k+1)=[uk+Ti/Ts]mod1 clc;clear;format long; fb=2e+6; %% 符号速率 fs=56e+6; %% 采样速率 ps=0; %%%%%%%%%平方根滤波器%%%%%%%%%因为是采样率是28倍符号速率,所以采用了500阶的滤波器系数,保证通带和阻带的特性 load FIR2M; Num=FIR2M; i=0;q=0; %%%%%%%%建立数据缓存区间%%%%%%%%%%%%% dataI=zeros(1,501); dataQ=zeros(1,501); bufferI=zeros(1,501); bufferQ=zeros(1,501); bitsyninI=zeros(1,4); %% 插值滤波器的输入,每次插值需要连续四个数据 bitsyninQ=zeros(1,4); GarI=zeros(1,3); GarQ=zeros(1,3); %%========环路滤波器=============== K0=fb*0.05; %% 环路的NCO增益 C2=2; Alpha=0.5; Kd=2*C2/((1-Alpha^2/4))*sin(pi*Alpha/2); %% 鉴相增益 K=K0*Kd; %% 环路增益 wn=0.03*fb; %% 环路滤波器的自然频率 Kesai=1/sqrt(2); %% 环路滤波器的衰减因子 %%============ 环路滤波器系数设计=========== g1=2*wn*Kesai/K; g2=wn^2/fb/K; g=[-g1;g1+g2]; cnt=0; %% 控制数据输出 LPF=0; %% 环路滤波输出 pre_TED=0; %% 前一鉴相值 TED=0; %% 当前鉴相值 %% NCO控制参数 deltamk=1; deltamkcnt=0; V=fs/fb/2; uk=0; t=0.014; %% 仿真时间 TimeLen=fix(t*fs); %%-------建立存储文件------------------------------------- if (exist('data1.txt')>0) delete data1.txt; end fid1=fopen('data1.txt','a+'); if (exist('data2.txt')>0) delete data2.txt; end fid2=fopen('data2.txt','a+'); if (exist('data3.txt')>0) delete data3.txt; end fid3=fopen('data3.txt','a+'); disp('QPSK---------BitSync') for k=1:TimeLen ProcessShow(k,TimeLen,25); %%过程显示 ps=ps+fb; %% if(ps>=fs) ps=ps-fs; i=randint*2-1; %% 输入随机数据 输出转化为双极性 q=randint*2-1; end dataI=[dataI(2:end),i]; %% 没有采用常规的插0方法,而是采用采样保持的方式 dataQ=[dataQ(2:end),q]; di=dataI*Num'; %% 成型滤波,Num为501位平方根升余弦滤波器 dq=dataQ*Num'; T_sign=(di+1j*dq); %% 发送信号 %%%%%%滑动窗存储接收信号,并完成卷积运算%%%%%%%%%%%%% bufferI=[bufferI(2:end),real(T_sign)]; %滑动窗存储接收信号 bufferQ=[bufferQ(2:end),imag(T_sign)]; ri=bufferI*Num'; %% 匹配滤波 rq=bufferQ*Num'; fprintf(fid1,'%f,%f\n',ri,rq); %%存储匹配滤波后的波形 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% deltamkcnt=deltamkcnt+1; bitsyninI=[bitsyninI(2:4),ri]; %%存储插值滤波前的连续4点 bitsyninQ=[bitsyninQ(2:4),rq]; if (flag) flag=0; C_4 = 0.5 * uk^2 - 0.5 * uk; % c_4=c(-2);其中内插系数为BS_Alpha=0.5 C_3 = -0.5 * uk^2 + ( 0.5 + 1 ) * uk; % c_3=c(-1) C_2 = -0.5 * uk^2 + ( 0.5 - 1 ) * uk + 1; % c_2=c(0) C_1 = 0.5 * uk^2 - 0.5 * uk; % c_1=c(1) C=[C_1,C_2,C_3,C_4]; Inter_I=bitsyninI*C'; %插值输出 Inter_Q=bitsyninQ*C'; GarI=[GarI(2:3),Inter_I]; %用数组存放,表示I(k-2),I(k-1),I(k) GarQ=[GarQ(2:3),Inter_Q]; cnt=mod(cnt+1,2); if (cnt==1) %% 以数据速率完成环路滤波 I=Inter_I; %% 同步数据输出 Q=Inter_Q; fprintf(fid2,'%f,%f\n',I,Q); %% 存储同步后的I,Q路数据 TED=GarI(2)*(GarI(3)-GarI(1))+GarQ(2)*(GarQ(3)-GarQ(1)); %Error=I(k-1)*[I(k)-I(k-2)]+Q(k-1)*[Q(k)-Q(k-2)]; LPF=[pre_TED,TED]*g+LPF; %环路滤波 pre_TED=TED; end end V=V-LPF/256; %V近似等于Ti/Ts; if (deltamkcnt==deltamk) flag=1; %%产生插值脉冲 deltamkcnt=0; %%计数器, deltamk=fix(uk+V); %%计算下一脉冲时刻 uk=mod(uk+V,1); V=fs/fb/2; %%保证V是一个近似等于Ti/Ts的值 end fprintf(fid3,'%f,%f,%f,%f\n',uk,deltamk,LPF,TED);%%%%%%%%%%%%%%%%存储观测参数 end disp('The End!'); load data3.txt; figure; plot(data3(:,1)) title('小数间隔索引uk'); figure; plot(data3(:,2)) title('整数间隔索引差M') load data2.txt figure;plot(data2(12000:end,1)+1j*data2(12000:end,2),'.') title('同步后的星座图')
主体:(一) 一、C++概述 (一) 发展历史 1980年,Bjarne Stroustrup博士开始着手创建一种模拟语言,能够具有面向对象的程序设计特色。在当时,面向对象编程还是一个比较新的理念,Stroustrup博士并不是从头开始设计新语言,而是在C语言的基础上进行创建。这就是C++语言。 1985年,C++开始在外面慢慢流行。经过多年的发展,C++已经有了多个版本。为次,ANSI和ISO的联合委员会于1989年着手为C++制定标准。1994年2月,该委员会出版了第一份非正式草案,1998年正式推出了C++的国际标准。 (二) C和C++ C++是C的超集,也可以说C是C++的子集,因为C先出现。按常理说,C++编译器能够编译任何C程序,但是C和C++还是有一些小差别。 例如C++增加了C不具有的关键字。这些关键字能作为函数和变量的标识符在C程序中使用,尽管C++包含了所有的C,但显然没有任何C++编译器能编译这样的C程序。 C程序员可以省略函数原型,而C++不可以,一个不带参数的C函数原型必须把void写出来。而C++可以使用空参数列表。 C++中new和delete是对内存分配的运算符,取代了C中的malloc和free。 标准C++中的字符串类取代了C标准C函数库头文件中的字符数组处理函数。 C++中用来做控制态输入输出的iostream类库替代了标准C中的stdio函数库。 C++中的try/catch/throw异常处理机制取代了标准C中的setjmp()和longjmp()函数。 二、关键字和变量 C++相对与C增加了一些关键字,如下: typename bool dynamic_cast mutable namespace static_cast using catch explicit new virtual operator false private template volatile const protected this wchar_t const_cast public throw friend true reinterpret_cast try bitor xor_e and_eq compl or_eq not_eq bitand 在C++中还增加了bool型变量和wchar_t型变量: 布尔型变量是有两种逻辑状态的变量,它包含两个值:真和假。如果在表达式中使用了布尔型变量,那么将根据变量值的真假而赋予整型值1或0。要把一个整型变量转换成布尔型变量,如果整型值为0,则其布尔型值为假;反之如果整型值为非0,则其布尔型值为真。布儿型变量在运行时通常用做标志,比如进行逻辑测试以改变程序流程。 #include iostream.h int main() { bool flag; flag=true; if(flag) cout<a; /*输入一个数值*/ cout<a; cout<a; for(int i=1;i<=10;i++) //C语言中,不允许在这里定义变量 { static int a=0; //C语言中,同一函数块,不允许有同名变量 a+=i; cout<<::a<< <size; int *array=new int[size]; for(int i=0;idt; if(dt>0 && dt<4) { const Date& bd=getdate(dt); cout<讨论的友元函数。 类中默认的数据类型是private,结构中的默认类型是public。一般情况下,变量都作为私有成员出现,函数都作为公有成员出现。 类中还有一种访问控制符protected,叫保护成员,以后再说明。 4.初始化 在声明一个类的对象时,可以用圆括号()包含一个初始化表。 看下面一个例子: #include iostream.h class Box { private: int height,width,depth; //3个私有数据成员 public: Box(int,int,int); ~Box(); int volume(); //成员函数 }; Box::Box(int ht,int wd,int dp) { height=ht; width=wd; depth=dp; } Box::~Box() { //nothing } int Box::volume() { return height*width*depth; } int main() { Box thisbox(3,4,5); //声明一个类对象并初始化 cout<tm_mon+1; yr=tim->tm_year; if(yr>=100) yr-=100; } int main() { time_t now=time(0); Date dt(now); dt.display(); return 0; } 本程序先调用time()函数来获取当前时间,并把它赋给time_t对象;然后程序通过调用Date类的转换构造函数来创建一个Date对象,该对象由time_t对象转换而来。time_t对象先传递给localtime()函数,然后返回一个指向tm结构(time.h文件中声明)的指针,然后构造函数把结构中的日月年的数值拷贝给Date对象的数据成员,这就完成了从time_t对象到Date对象的转换。 二、成员转换函数 成员转换函数把该类的对象转换为其他数据类型的对象。在成员转换函数的声明中要用到关键字operator。这样声明一个成员转换函数: operator aaa(); 在这个例子中,aaa就是要转换成的数据类型的说明符。这里的类型说明符可以是任何合法的C++类型,包括其他的类。如下来定义成员转换函数; Classname::operator aaa() 类名标识符是声明了该函数的类的类型说明符。上面定义的Date类并不能把该类的对象转换回time_t型变量,但可以把它转换成一个长整型值,计算从2000年1月1日到现在的天数。 #include iostream.h class Date { int mo,da,yr; public: Date(int m,int d,int y) {mo=m; da=d; yr=y;} operator int(); //声明 }; Date::operator int() //定义 { static int dys[]={31,28,31,30,31,30,31,31,30,31,30,31}; int days=yr-2000; days*=365; days+=(yr-2000)/4; for(int i=0;i帖中) #include iostream.h class CustomDate { int da,yr; public: CustomDate() {} CustomDate(int d,int y) { da=d; yr=y; } void display() const {cout<链表中使用this指针 在应用程序中,如果数据结构里有指向自身类型的成员,那么使用this指针会提供更多的方便。下面的程序中建立了一个类ListEntry的链表。 #include iostream.h #include string.h class ListEntry { char* listvalue; ListEntry* preventry; public: ListEntry(char*); ~ListEntry() { delete [] listvalue; } ListEntry* PrevEntry() const { return preventry; }; void display() const { cout< name; if (strncmp(name, end, 3) == 0) break; ListEntry* list = new ListEntry(name); if (prev != 0) prev->AddEntry(*list); prev = list; } while (prev != 0) { prev->display(); ListEntry* hold = prev; prev = prev->PrevEntry(); delete hold; } return 0; } 程序运行时,会提示输入一串姓名,当输入完毕后,键入end,然后程序会逆序显示刚才输入的所有姓名。 程序中ListEntry类含有一个字符串和一个指向前一个表项的指针。构造函数从对中获取内存分配给字符串,并把字符串的内容拷贝到内存,然后置链接指针为NULL。析构函数将释放字符串所占用的内存。 成员函数PrevEntry()返回指向链表前一个表项的指针。另一个成员函数显示当前的表项内容。 成员函数AddEntry(),它把this指针拷贝给参数的preventry指针,即把当前表项的地址赋值给下一个表项的链接指针,从而构造了一个链表。它并没有改变调用它的listEntry对象的内容,只是把该对象的地址赋给函数的参数所引用的那个ListEntry对象的preventry指针,尽管该函数不会修改对象的数据,但它并不是常量型。这是因为,它拷贝对象的地址this指针的内容给一个非长常量对象,而编译器回认为这个非常量对象就有可能通过拷贝得到的地址去修改当前对象的数据,因此AddEntry()函数在声明时不需要用const。 主体:(六)类对象数组和静态成员 一、类对象数组 类的对象和C++其他数据类型一样,也可以为其建立数组,数组的表示方法和结构一样。 #include iostream.h class Date { int mo,da,yr; public: Date(int m=0,int d=0, int y=0) { mo=m; da=d; yr=y;} void display() const { cout<链表首项和末项的地址。 #include iostream.h #include string.h class ListEntry { public: static ListEntry* firstentry; private: static ListEntry* lastentry; char* listvalue; ListEntry* nextentry; public: ListEntry(char*); ~ListEntry() { delete [] listvalue;} ListEntry* NextEntry() const { return nextentry; }; void display() const { cout<name

19

社区成员

发帖
与我相关
我的任务
社区管理员
  • community_1513
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧