物联网前沿实践【2】-信号处理基础
参考:https://iot-book.github.io/2_%E4%BF%A1%E5%8F%B7%E5%A4%84%E7%90%86%E5%9F%BA%E7%A1%80/S1_%E4%BF%A1%E5%8F%B7%E7%9A%84%E5%8F%91%E9%80%81%E5%92%8C%E6%8E%A5%E6%94%B6/
我们首先可以尝试一下用声音信号模拟,简单生成声音信号、录音以及播放录音文件的代码如下;
%% 制造段声音 fprintf("制造一段声音") Fs = 48000; % 采样频率(单位:Hz) # 一秒钟采集的样本数量 T = 4; % 时间长度(单位:s) f = 2000; % 信号频率(单位:Hz) y = sin(2*pi*f*(0 : 1/Fs : T)); % 产生声音 sound(y,Fs) % 播放声音 audiowrite('sound.wav', y, Fs); % 保存声音 %% 接受一段声音 fprintf("接受一段声音") Fs = 48000; % 采样频率(单位:Hz) Rec = audiorecorder(Fs, 16, 1); % 定义录音对象 从前到后依次是 采样频率 , 采样位数 和 声道数 T = 4; % 录音时长(单位:s) record(Rec, T); % 开始录音 pause(T); % 等待录音结束 y = getaudiodata(Rec); % 从录音对象中取出音频数据 audiowrite('savesound.wav', y, Fs); %% 播放一段音乐 fprintf("播放一段音乐") [x, Fs] = audioread('C:\Dev\MATLAB\MATLAB_2020b_path\bin\物联网前沿实践学习文档\第二章 信号处理基础\savesound.wav'); sound(x, Fs*1.3); % 正常播放 fprintf('默认抽样频率为:%d\n', Fs); %查看默认抽样频率Fs %% 信号的产生过程 %% 产生一个频率为5Hz、时长为1s的信号; fprintf("产生一个频率为5Hz、时长为1s的信号;") t = 0:1/200:1; % 1s内200个采样点,其实就是采样频率 f = 100; % 频率f=5Hz y = sin(2*pi*f*t); plot(t, y); % 奈奎斯特采样定律 告诉我们,为了进行合理地采样,保证采样后的数据能够还原出原来的信号, % 采样后的信号包含原来信号的所有特征。采样频率必须满足fs≥2∗f,f是给定连续信号的频率。 % 采样过程所应遵循的规律,又称取样定理、抽样定理。采样定理说明了采样频率与信号频谱之间的关系,是连续信号转换为离散信号的基本依据。
在此要区分好什么是采样率什么是频率,根据奈奎斯特定理,采样率要大于频率的两倍,这是必须保证的事情,这样被量化为离散的数字信号之后,才能够还原出以前的物理信号。
打个比方,比如下面这个信号:
这是上面写的最后的代码——频率为5Hz,采样率100,采样率远远大于频率,因此看上去,就是连续的曲线。
当我们降低采样率,比如20,那就是:
再降,降低到11:
我们仍然能够靠猜测来画出完整轨迹,再降低呢?
比如,10:
此时信号已经彻底失去了规律。
这就涉及到一个信号量化的过程,也就是我们将连续信号转换为离散的数字信号的量化过程,采样点多,则这种量化约精准。平时说的高保真,其实指的就是存储的细节足够多,使得离散信号更加接近原始信号。但是离散信号与原始信号肯定会因为这个量化过程产生区别,这个区别就是量化噪声带来的。
单说量化,有均匀量化和非均匀量化两种,即采样点间隔均匀就是均匀量化,反之。
至此,物理信号就被转换成了数字信号,就可以使用计算机来处理了。
这一章也会有一个实例,但是其是安卓的开发环境,本文重点为入门,因此看一看就好:https://iot-book.github.io/2_%E4%BF%A1%E5%8F%B7%E5%A4%84%E7%90%86%E5%9F%BA%E7%A1%80/S5_%E6%A1%88%E4%BE%8B%EF%BC%9A%E5%AE%9E%E7%8E%B0%E4%B8%80%E4%B8%AA%E5%BD%95%E9%9F%B3%E3%80%81%E6%94%BE%E9%9F%B3%E7%A8%8B%E5%BA%8F/