- 博客(47)
- 收藏
- 关注
原创 仿真1,采样信号仿真
单个矩形信号的脉冲采样及其频域本MATALB程序仿真了单个矩形信号的波形以及其频域,并且对应的对矩形信号进行采样后得到的波形以及其频域。注意原信号以及采样信号的频域都是连续的,文中为了方便观察用离散的图。具体程序如下:%1.矩形信号的脉冲采样形式,以及其对应的傅里叶变换%单个矩形信号不必要用rectpuls函数,直接用一个%周期性的函数square,只要观察窗口在一个周期内即可%但在计算的时候不能用square计算,否则会出问题%但是反过来想,若界定square内的数据只要不用到%一个周期
2021-09-26 19:49:48 556
原创 9.系统零极点决定时域特性
9.系统零极点决定时域特性1.参考书籍《信号与系统》第四章1s+a←→e−atu(t)\frac{1}{s+a}\leftarrow\rightarrow e^{-at}u(t)s+a1←→e−atu(t)ωs2+ω2←→sin(ωt)\frac{\omega}{s^2+\omega^2}\leftarrow\rightarrow\sin(\omega t)s2+ω2ω←→sin(ωt)ω(s+a)2+ω2←→e−atsin(ωt)\frac{\omega}{(s+a)^2+\om
2021-07-15 18:42:34 822
原创 8.拉普拉斯变换
8.拉普拉斯变换一、拉普拉斯变换定义要知道不是所有函数傅里叶变换都存在,为了找到收敛变换,在傅里叶变换基础上,信号乘以一个衰减因子e−σte^{-\sigma t}e−σt于是得到拉普拉斯变换对:F(s)=∫0∞f(t)e−stdtf(t)=12π∫σ−j∞σ+j∞F(s)estds\begin{aligned}F_(s)&=\int_0^{\infty}f(t)e^{-st}dt\\f(t)&=\frac{1}{2\pi}\int_{\sigma-j\infty}^{\sigm
2021-07-13 19:40:20 4214
原创 复变函数基础
a.单连通区域积分与路径无关的四个等价命题若函数P(x,y)P(x,y)P(x,y)和Q(x,y)Q(x,y)Q(x,y)在单连通区域G内具有一阶连续偏导数,则,下面四个陈述等价:(1)曲线积分∫LPdx+Qdy\int_LPdx+Qdy∫LPdx+Qdy与路径无关,其中LLL为G内任意分段光滑曲线。(2)沿G任意任意分段光滑闭合曲线C的积分等于0,即∮Pdx+Qdy=0\oint Pdx+Qdy=0∮Pdx+Qdy=0.(3)存在函数u(x,y)u(x,y)u(x,y)使得du=Pdx+Qdyd
2021-07-10 18:11:50 471
原创 7.抽样定理
7.抽样定理根据前几节的推导,很容易得到抽样定理:时域采样定理: 一个频谱带限信号f(t)f(t)f(t),如果频谱只占据−ωm-\omega_m−ωm~+ωm+\omega_m+ωm的范围,则信号f(t)f(t)f(t)可以用等间隔的抽样值唯一表示。最高时域抽样间隔为12fm\frac{1}{2f_m}2fm1,即最低抽样频率为2fm2f_m2fm.频域采样定理一个时域带限信号f(t)f(t)f(t),如果时域只占据−tm-t_m−tm~+tm+t_m+tm的范围,则信号可以用等
2021-07-09 21:45:52 1517
原创 6.抽样信号的傅里叶变换
6.抽样信号的傅里叶变换1.时域采样先直接给出结论: 信号f(t)f(t)f(t)被p(t)p(t)p(t)时域抽样后得到fs(t)f_s(t)fs(t),fs(t)f_s(t)fs(t)频谱Fs(ω)F_s(\omega)Fs(ω)是连续信号f(t)f(t)f(t)频谱F(ω)F(\omega)F(ω)的形状以抽样频率ωs\omega_sωs为间隔的周期性重复而得到,重复过程中,幅度被p(t)p(t)p(t)所加权。F(ω)F(\omega)F(ω)在重复过程中形状不会发生变化。(1)冲
2021-07-09 21:24:17 7552
原创 5.周期信号的傅里叶变换
5.周期信号的傅里叶变换1.周期信号的傅里叶变换f(t)=∑n=−∞∞Fnejnω1t\begin{aligned}f(t)&=\sum_{n=-\infty}^{\infty}F_ne^{jn\omega_1t}\\\end{aligned}f(t)=n=−∞∑∞Fnejnω1t两边做傅里叶变换F(ω)=∑n=−∞∞Fn2πδ(ω−nω1)F(\omega)=\sum_{n=-\infty}^{\infty}F_n2\pi\delta(\omega-n\omega_1)
2021-07-09 20:01:23 16856
原创 4.傅里叶变换的其他特性
4.傅里叶变换的其他特性f(t)←→F(ω)f(t)\leftarrow\rightarrow F(\omega)\\f(t)←→F(ω)1.时域卷积特性f1(t)∗f2(t)←→F1(ω)F2(ω)f_1(t)*f_2(t)\leftarrow\rightarrow F_1(\omega)F_2(\omega)f1(t)∗f2(t)←→F1(ω)F2(ω)2.频域卷积特性f1(t)f2(t)←→12πF1(ω)∗F2(ω)f_1(t)f_2(t)\leftarrow\righ
2021-07-09 18:00:27 153
原创 3.傅里叶级数与傅里叶变换
3.傅里叶级数与傅里叶变换一、傅里叶级数 1.欧拉公式ejθ=cos(θ)+jsin(θ)e^{j\theta}=cos(\theta)+jsin(\theta)ejθ=cos(θ)+jsin(θ) 2.ana_nan与bnb_nbn关于n的奇偶特性an=2T∫−T/2T/2f(t)cos(nω0t)dta_n=\frac{2}{T}\int^{T/2}_{-T/2}f(t)cos(n\omega_0t)dtan=T2∫−T/2T/2f(t)cos(nω0t)dtb
2021-07-08 10:52:04 1297 1
原创 2.级数与傅里叶级数
级数与傅里叶级数 由数学课程可知,确定函数能展开成幂级数形式或者傅里叶级数形式。1.幂级数 简单幂级数例子: 对于f(x),在x=0处可导,在点x=0的某一领域D内可以展开成f(x)=∑n=0∞f(n)(x)n!xnf(x)=\sum^{\infty}_{n=0}\frac{f^{(n)}(x)}{n!}x^nf(x)=n=0∑∞n!f(n)(x)xn D称为收敛域,可以通过柯西准则求出。 于是对于常见的函数f(x)=11−xf(x)=\frac{1}{1-x}f(x
2021-07-07 10:38:06 817
原创 1.信号与系统基础
1.信号与系统基础1.信号的四则运算以及变换2.线型时不变系统,输入e(t),输出r(t),a、b为系数->表示输入到输 出的过程 a.线性ae1(t)+ae2(t)−>ar1(t)+br2(t)ae_1(t)+ae_2(t)->ar_1(t)+br_2(t)ae1(t)+ae2(t)−>ar1(t)+br2(t) b.时不变特性e(t−t0)−>r(t−t0)e(t-t_0)->r(t-t_0)e(t−t0)−>r(t−t0)
2021-07-07 09:37:37 469
原创 coding第15天1.3
C语言命名规范之前自己总结不完善,下面给出完善的总结。对于常量命名,同样使用大写字母,对于typedef声明的类型同样首字母大写。对于函数与变量,规范如下:参考链接https://www.cnblogs.com/wfwenchao/p/5209197.htmlC是一门朴素的语言,你使用的命名也应该这样。与Modula-2和Pascal程序员不同,C程序员不使用诸如“ThisVariableIsATemporaryCounter”这样“聪明”的名字。C程序员应该叫它“tmp”,这写起来更简单,也不会更
2020-11-21 21:47:41 105
原创 coding第15天1.3
C语言的书写规范在学习数据结构时,因为代码不规范性很难专注,主要在于变量以及函数的大小写命名方面,先解决这个问题。首先,学习c语言的书写规范性,不讨论语法。(1)一个C语言文本的后缀名为.c(2)C语言文本的内容,不谈。描述不如直接看代码简单。1.C语言变量名----命名规范(1)名字由字母和数值组成的序列,但其中第一个字符必须为字母,下划线‘_’也被看成字母。(2)库例程的名字通常以下划线开头(3)大小写字母有别。(4)变量名使用小写字母,符号常量全部使用大写字母。所以当前变量值,可以
2020-11-21 19:24:30 71
原创 coding第15天1.2
线性表抽象数据类型线性表的定义如下:ADT List{数据对象:D={ai|ai属于ElemSet,i,2,3…,n,n>=0}数据关系:R1={<a(i-1),a(i)>|a(i),a(i-1)属于D,i=1,2,…n}基本操作:InitList(&L)操作结果:构造一个空的线性表。DestroyList(&L)初始条件:线性表已经存在。操作结果:销毁线性表。ClearList(&L)初始条件:线性表已经存在。操作结果:将L重置为空表。
2020-11-21 17:43:06 194
原创 coding第15天1.1
《数据结构》严版本预定义的常量和类型,在本书中书写的风格为c++风格,语法也是c++语法。#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2typedef int Status;typedef int ElemType;...
2020-11-21 09:33:41 73
原创 coding第14天1.2
抽象数据类型开始对数据结构的学习。书中采用以下的书写格式定义抽象数据类型:ADT 抽象数据类型名{数据对象:数据对象的定义。数据关系:数据关系的定义。基本操作:基本操作的定义。}ADT 抽象数据类型名。其中数据对象和数据关系的定义用伪码描述。基本操作的定义格式为基本操作名(参数名)初始条件:初始条件描述。操作结果:操作结果描述。例如抽象三元组定义:ADT Triplet{数据对象:D={e1,e2,e3|e1,e2,e3属于ElemSet(定义了关系运算的某个集合)}数据关系
2020-11-20 23:43:18 105
原创 coding第14天
存储分配程序1.首先设计对齐要求typedef long Align;union header{ struct { union header *ptr; unsigned size; }s; Align x;};typedef union header Header;在malloc中请求的长度将被舍入,以保证是头部的整数倍,static Header base;static Header *freep;void *malloc(unsigned ntypes){
2020-11-20 12:37:40 65
原创 coding第12天1.1
标准库fopen和getc的一种实现方法标准库的文件不是通过文件描述符实现的,而是通过文件指针描述的,文件指针是一个指向包含文件各种信息的结构的指针。该结构包含以下内容:(1)指向缓冲区的指针(可以一次读入文件一大块内容)(2)一个记录缓冲区中剩余字符的计数器(3)指向缓冲区下一个字符的指针(4)文件描述符(5)描写读写模式的标志,描述错误状态的标志可以写成typedef struct _iobuf{char *base;int cnt;char *ptr;int fd;int
2020-11-18 10:58:11 92
原创 coding第11天1.4
fopen函数#include <fcntl.h>#include <unistd>#define PERMS 0666FILE *fopen(char *name,char *mode){ int fd; FILE *fp; if(*mode!='r'&&*mode!='w'&&*mode!='a') { return NULL; } for(fp=_iob;fp<_iob+OPEN_MAX;fp++) {
2020-11-16 22:38:57 108
原创 coding第11天1.4
<stdio.h>中的一段#define NULL 0#define EOF (-1)#define BUFSIZ 1024#define OPEN_MAX 20typedef struct _iobuf{ int cnt; char *ptr; char *base; int flag; int fd;}FILE;extern FILE _iob[OPEN_MAX];#define stdin (&_iob[0])#define stdout (&
2020-11-16 20:31:31 76
原创 coding第11天1.3
unix系统接口两个系统调用int n_read=read(int fd,char *buf,int n);int n_written=write(int fd,char *buf,int n);对于系统调用read和write,第一个参数为文件描述符,第二个参数为程序中存放读或者写的字符数组,第三个参数为要传输的字节数。用read构造getchar函数,因为没有重定向所以系统默认从标准输入中读即文件描述符0—stdin下面这个版本 依次读一个字符并且返回一个字符。#include <u
2020-11-16 17:55:08 77
原创 coding第11天1.3
行输入输出标准库行数提供一个输入函数;char *fgets(char *line,int maxline,FILE *fp);函数从fp指向的文件中读取下一个输入行(包括换行符),并将其存在字符数组line中,最多可以读取maxline-1个字符。读取的行将以‘\0’结尾保存到数组中。输出函数fputs将一个字符串写入到一个文件中:int fputs(char *line,FILE *fp);库行数gets与puts与fgets以及fputs类似,但是是对stdin和stdout进行操作。有一
2020-11-15 22:19:19 51
原创 coding第11天1.2
文件访问为了读写一个文件,在<stdio.h>中定义了一个结构体,该结构体可能通过typedef声明为FILE,结构体内容为,缓冲区的位置、缓冲区当前字符的位置,文件的读写状态,是否出错或者是否已经达到文件尾部,应该还有一个字符串用来存储文件内容;形如这种typedef struct{int location;//类型待定,可能是基本数据类型也可能是个结构体int currt_location;int status;bool err;char *file_content;}FI
2020-11-15 16:07:29 58
原创 coding第11天1.1
变长参数表c语言给出处理变长参数的语法,(1)在标准头文件<stdarg.h>中包含一组宏定义(a)va_list类型用于声明一个变量ap,该变量依次引用各个参数。例如 val_list ap;(b)宏va_start将参数指针ap初始化,初始化为指向第一个无名参数的指针。该宏的输入参数值为参数指针ap,最后一个有名参数的指针。例如:va_start(ap,fmt);(c)函数va_arg,作用为将ap指向下一个参数。参数为参数指针ap,类型名;返回值为确定类型的参数值。例
2020-11-15 11:16:51 48
原创 coding第10天1.4
联合联合的目的在于创造一种可以多种选择的类型;某一个时刻只存在一种类型。语法如下union u_tag{int ival;float fval;char *sval;}u;(1)变量u必须足够大,以保存3种类型中的最大一种。(2)读取的类型必须是最近存入的类型。(3)只能用第一个成员值类型初始化。最后其他语法与结构语法一致。位字段想象一个int型,4个字节,32比特,假设只需要访问32个位中的某些位;当然可以用位运算实现。当然也可以用字段定义来代替,书中没有仔细说明,我们假设这是
2020-11-14 12:13:54 108
原创 coding第10天1.3
类型定义typedeftypedef与宏定义功能类似,但是宏的定义define是专注于变量、函数、表达式的替换;类型定义typedef专注于类型比如,int、char、struct node等替换。typedef int Length;就可以用Length表示int类型。更进一步:(1)对于结构类型struct node{int count;char *s;};typedef struct node Node;就可以用Node表示这样一个结构类型。typedef struct
2020-11-14 11:39:09 133 1
原创 coding第10天1.2
有关语法一、对于变量(1)声明声明的目的是确定类型;但是不分配内存,比如int,char以及结构声明struct node{int count,struct node *next;};以上语法是对类型的声明语法。(a)一般来说,对变量在该处声明,该变量的作用域则从该处开始到文本结束。(b)不同的文本,同一个程序中中可以用extern来声明全局变量,从而使用。(注意:局部变量只在函数体中有效,从声明直到函数结束)(c)但是定义成static变量,则不能在该文本之外使用,所以static
2020-11-14 11:13:28 68
原创 coding第10天
表查找解决文本替换问题,采用哈希散列查找方法。1.先声明一个链表节点该节点有三个元素,(a)指向下一个节点指针(b)指向名字的指针(c)指向替换文本的指针struct nlist{ struct nlist *next; char *name; char *defn;};2.定义一个指针数组数值长度为101,数组元素为指向链表节点的指针,#define HASHSIZE 101static struct nlist *hashtab[HASHSIZE];3.为了将文本散
2020-11-14 10:17:54 101
原创 coding第9天
自引用结构本节利用统计单词输入的次数,通过二叉树存储,来说明自引用结构。首先,对于二叉树有struct tonde{ int count; char *word; struct tnode *left; struct tnode *right;};上述的声明,就是自引用结构的声明形式,在声明中自定义是逻辑错误的,比如定义该类型的前提是该类型已经能够实例化,这是存在性的逻辑错误,但是如果定义指向该类型的指针在c语言中是被允许的。下面,统计出现的单词的次数。算法如下:1.先定义二叉树的
2020-11-12 23:21:15 77
原创 coding第8天1.1
指向结构的指针重新写binsearch函数,struct key *binsearch(char *word,struct key *tab,int n){ int cond; struct key *low=&tab[0]; struct key *high=&tab[n]; struct key *mid; while(low<high) { mid=low+(high-low)/2; if((cond=strcmp(word,mid->word)
2020-11-11 21:31:15 89
原创 coding第8天
结构指针为了方便描述结构体的成员变量,以及更加方便的应用结构体,引入结构指针,定义struct point *pp;pp为结构指针,*pp为该结构体,(*pp).x为结构成员,为了方便引用结构成员,使用如下书写形式p->x.下面给出单词统计程序,算法为;while还有未处理的单词。用binsearch查找,并统计先结构数组。struct key{char *word;int count;}keytab[]={“auto”,0,“break”,0,“case”,0,“
2020-11-11 20:49:43 59
原创 coding第7天1.1
结构体根据书中的启发,结构体能抽象描述更多的事物。结构的命名对于结构体,关键字struct引入结构声明,结构声明由包含在花括号内的一系列声明组成,关键字struct后面的名字是可选的,称为结构标记,结构标记用于为结构命名,在定义之后,结构标记就代表花括号内的声明,可以用它作为声明的简写形式。结构成员运算符‘.’将结构名与成员名连接起来。一般结构体的声明我们使用typedef比较方便。struct point { int x; int y;};上面为结构体声明,该结构体可以描述一个点。
2020-11-10 09:09:41 69
原创 coding第6天1.5
指向函数的指针为例说明指向函数的指针用法,接下来修改之前的排序函数,在给定可选参数-n的情况下,将函数按数值大小而非字典顺序排序。#include <stdio.h>#include <string.h>#define MAXLINES 5000char *lineptr[MAXLINES];int readlines(char *s[],int maxlines);void writelines(char *s[],int nlines);void qsort(
2020-11-09 22:17:13 36
原创 coding第6天1.4
指针数组的应用与命令行参数以下的程序,有助于展示指针数组的操作与命令行参数的应用。下面的函数,可选参数的查找,当-x时,表示打印与模式不匹配的行,当-n时候表示打印行号。并且可选参数能够组合。打印所有与第一个参数指定的模式相匹配的行。#include <stdio.h>#include <string.h>#define MAXSIZE 1000int getline(char *s,int maxline);int main(int argc,char *ar
2020-11-08 23:20:42 58
原创 coding第6天1.3
命令行参数在支持c语言的环境中,可以在程bbi序开始执行时将命令行参数传递给程序。调用主函数main时,带有两个参数,第一个参数的值argc表示运行程序时,命令行中参数的数目,第二个参数是一个指向字符串数组的指针,其中每个字符串对应一个参数。最简单的例程echo如下:#include <stdio.h>int main(int argc,char *argv[]){ int i; for(i=1;i<argc;i++) { printf("%s%s",argv[i
2020-11-08 20:37:11 76
原创 coding第6天1.2
多维数组考虑一个日期转换问题,将某月某日转换为转换成某年第几天。首先,分析该年是闰年还是非闰年,然后在该年的月份上加上天数,比如闰年的3月10日,则是31+29+10=70,即该年的第70天。将某年的第几天,转换为某年的某月某日,同样,先分析该年是闰年还是非闰年,然后在该年的日期转换为月份日期,比如闰年第100天,则是100-31=69>0,故大于1月,69-29=40>0,故大于二月,40-31=9>0,故大于三月,9-30<0,故在四月,即为4月9日。为了方便处理,将
2020-11-08 18:51:03 63
原创 coding第6天1.1
输入文本排序对于之前的文本排序方法,通过先输入,后排序,再输出。我们也可以通过一边输入一遍排序。即算法为:读入一行,放在指针数组的第一位。将新读入的行插入到正确的位置重复上述的比较插入过程。输出排好序的指针数组。先写输出函数。#include <stdio.h>void printline(char *s[],int nlines){ int i; for(i=0;i<nlines;i++) { printf("%s\n",s[i]);//当为\0的时候
2020-11-08 16:05:28 72
原创 coding第6天
程序按字母顺序对文本集合进行排序首先程序算法为:读入所有的行;对文本进行排序;按次序打印文本;所以首先建立一个读入所有行的程序,程序的输入值为一个指针数组,存储指向字符串的指针,并且还有一个最大行参数保证输入的最大行数。输出值为:当正常输出时输出行数,当异常输出时输出-1.int readline(char *s[],int maxline){ int nlines,len; char temp[MAXSIZE]; char *p; int getline_1(char *s,int
2020-11-08 11:36:54 53
原创 coding第5天1.2
快速排序(K&R)直接上代码,然后解释各个值的作用void qsort(int v[],int left,int right){ int i,last; void swap(int v[],int i,int j); if(left>=right) { return; } swap(v,left,(left+right)/2); last=left; for(i=left+1;i<=right;i++) { if(v[i]<v[left])
2020-11-05 23:25:25 64
原创 coding第5天
快速排序(c)参考文献链接: link.基本思想:对数组进行排序,先随机取一个数(通常拿数组的第一个数)。将该数插入一个位置,使得它左边的数都比它小,它右边的数都比它大。这样就将一个数组分成两个子数组。然后再以同样的方法将子数组分成更小的子数组,直到不能分解位置。举例说明,假设我们现在对“6 1 2 7 9 3 4 5 10 8”这十个数进行排序,首先在序列中随机找一个数为基准数。为了方便,取第一个数6为基准数,接下来将序列中所有比6大的数放在6的右边,比6小的数放在6的左边。具体方法如下:取
2020-11-05 22:55:03 58
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人