DSP 学习笔记 |(三)C & DSP 基础概念

本文最后更新于:6 天前

记录在学习过程中所需的 C 语言与 DSP 相关基础知识补充。

一、C 语言基础

1.1 零碎

  1. const 修饰:用 const 修饰过的指针变量 p 不能修改 a 中的内容,而没有用 const 修饰过的指针变量 q 照样可以修改 a 中的内容,而且 a 自己也可以重新给自己赋值。它用来 告诉编译器, 被修饰的这些东西,具有“只读”的特点

  2. C 语言中 “ ! ” 是对立面的意思。例如 ! = 就是不等于的意思,常用在循环条件判断中,或者逻辑运算中,例如 x=! (1==1),(1==1)的结果为1,但有! X的结果从1变为0。

    image-20220706163451150

  3. 字节对齐:计算机中内存大小的基本单位是字节(byte),理论上来讲,可以从任意地址访问某种基本数据类型,但是实际上,计算机并非逐字节大小读写内存,而是以 2,4,或 8 的 倍数的字节块来读写内存,如此一来就会对基本数据类型的合法地址作出一些限制,即它的地址必须是 2,4 或 8 的倍数。那么就要求各种数据类型按照一定的规则在空间上排列,这就是对齐。

    对齐原因:根本在于 CPU 访问数据的效率问题。

    image-20220708153912242

    对齐准则:总的来说,字节对齐有以下准则:

    • 结构体变量的首地址能够被其对齐字节数大小所整除
    • 结构体每个成员相对结构体首地址的偏移都是成员大小的整数倍,如不满足,对前一个成员填充字节以满足。
    • 结构体的总大小为结构体对最大成员大小的整数倍,如不满足,最后填充字节以满足。
  4. 寄存器:CPU 内部的存储单元,寄存器是 CPU 内部用来创建和储存 CPU 运算结果和其它运算结果的地方。

  5. 计算机字长(机器字长):计算机字长(机器字长)取决于数据总线的宽度,通常就是CPU一次能处理的数据的位数(CPU位数)。

  6. argc & argv:

    argc 是 argument count 的缩写,表示传入 main 函数中的参数个数,包括这个程序本身;

    argv 是 argument vector 的缩写,表示传入 main 函数中的参数列表,其中 argv[0] 表示这个程序的名字。

image-20220708165617659

    • 二进制的【或】运算:遇1得1
      参加运算的两个对象,按二进制位进行“或”运算。
      运算规则:0|0=0; 0|1=1; 1|0=1; 1|1=1;
      参加运算的两个对象只要有一个为1,其值为1。
    • 二进制的【与】运算:遇0得0
      运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1;
      即:两位同时为“1”,结果才为“1”,否则为0
    • 二进制的【非】运算:各位取反
      运算规则:~1=0; ~0=1;
      对一个二进制数按位取反,即将0变1,1变0。
    • 二进制的【异或】运算符 “^”:相同为0 ,不同为1”
      参加运算的两个数据,按二进制位进行“异或”运算。
      运算规则:0^0=0; 0^1=1; 1^0=1; 1^1=0;
      参加运算的两个对象,如果两个相应位为“异”(值不同),则该位结果为1,否则为0。
  1. 有符号位 & 无符号位image-20220712164201496

  2. 浮点数标准

image-20220712172111112

v2-f7561bf6717325ea710620df172ff528_r

image-20220712175656905

  1. 小数的二进制计算

    采用 “乘 2 取整,顺序排列” 法,用 2 乘十进制小数,可以得出积,将积的整数部分取出,再用 2 乘余下的小数部分,又得到一个积,再将积的整数部分取出,如此进行,直到积中的小数部分为零,或者达到所要求的精度为止。然后把取出的整数部分按顺序排列起来。

    20190601082719128

  2. 内联函数能提高程序运行效率(inline)

  3. 正数的补码是其本身,负数是除最高位(符号位)保留外,其余取反,末位加一。

  4. 宏函数:宏函数是在 程序编译时进行简单的字符替换,而函数是在程序生成后才进行调用,这时会占用开销时间(主程序函数保留现场,在子函数体中需要进行参数的传递 – 实参传递给形参以及调用完后形参的销毁等步骤 ),因此宏函数占用的编译时的时间,而函数占用的是执行时的时间。

    注意宏函数在调用时只是对函数中的变量做简单的 替换,注意这里的替换真的是替换,非常死板的那种!!!所以在宏函数中经常看到()

    image-20220721114507999 image-20220721114522687

1.2 汇编 & 反汇编

汇编语言是高级语言转换成机器码的桥梁,通过汇编语言的编译转换成机器码,计算机就可以执行程序。

因为在计算机中,所有的程序都是按照机器码执行的,所以对汇编语言的理解,能够增加对底层执行的认识。

下图为一个 c 程序变成一个可执行程序的过程:

20161106180515946

汇编

  1. 动词,指的是把 汇编语言 翻译成机器语言的过程。
    就是图中 hello.s 文件经过汇编器变成二进制 hello.o 文件的过程。
  2. 名词,指的便是汇编语言
    就是 hello.c 经过预处理器,再经过编译器生成的 hello.s 文件。这个文件里的东西就叫汇编程序(汇编语言)。

汇编指令一般都是由操作符和操作数组成,操作符也被称为指令助记符,它是指令中的关键字,表示本条指令操作类型,不能省略。操作数可以省略,也可以有很多,但各操作数之间要用 “,”分开。指令助记符与操作符之间要用空格分开。

反汇编:

  1. 动词,指的是由已生成的机器语言(二进制语言)转化为汇编语言的过程,也可以说是汇编的逆向过程。
  2. 名词,指的是有机器语言经过反汇编过程生成的汇编语言。
  3. 反汇编生成的汇编代码,每一行前面都有一串16进制的数字。这些数字就是每一行汇编代码对应的机器代码。
  4. 反汇编就是我们把一系列的机器码转换成改程序的助记符。如果我们拿到一份机器码程序,而我们想要知道他的功能和工作方式,可以对机器码进行反汇编。

二、DSP 基础

2.1 定点数与浮点数

首先我们要认清一个概念,定点数不一定是整数,浮点数不一定是小数。

为了轻松指定使用多少位来表示数字的整数和小数部分,我们使用称为Q格式的表示法。例如,要指定我们对整数部分使用三位,对小数部分使用四位,我们可以说数字采用 Q3.4 格式。

如其名,浮点数和定点数的区别就在于浮点和定点上,点就是指小数点。浮点数就是小数点是浮动的,定点数就是小数点是固定不动的。

image-20220712174207897

数字信号处理可以分为两类:定点和浮点。 区分依据是用于存储和操纵数据数字表示的格式。 定点 DSP 设计用于表示和操控整数,包括正整数和负整数,最低为 16 位,因而可能的位模式有 65,536 种 (2^16 浮点 DSP 用于表示和操控有理数,最低为 32 位,与科学计数法相似,数值用尾数和指数表示(例如 A x 2B, A 为尾数,B 为指数),因而可能的位模式有 4,294,967,296种 (2^32).

对定点数而言,数值范围与精度是一对矛盾,一个变量要想能够表示比较大的数值范围,必须以牺牲精度为代价;而想提高精度,则数的表示范围就相应地减小。

image-20220712173606593

image-20220712170135724

image-20220712165740026

2.2 饱和运算

所谓饱和运算,就是当运算结果大于一个上限或小于一个下限时,结果就等于上限或是下限。例如:BYTE 运算,最大值是 255,0xF1+0x35 应该是等于 0x26,但由于结果大于 255,那么饱和运算的结果就是 0xFF。在图像处理里经常有(比如说增加亮度)两种灰度值运算后要判断值是否大于 255 或小于 0,根据结果再取 255 或 0。


 目录


# Do more, know more, be more