原文链接:http://guqian110.github.io/pages/2015/08/27/summary_of_frequency_in_digital_signal_processing.html
最近实习的时候,发现自己的 DSP 基本功还是不够扎实,关于模拟/数字角频率,频率,采样速率等一些概念理解的都不太深刻,愧对老师和这么多年的学习,Google 到一些讲解的比较清楚的 blog,备忘(抄袭)过来,温故而知新。
unit circle & sin(cos)
首先从最基本的三角函数的定义开始:
三角函数的定义方式有很多种,我觉得基于单位圆的定义是最形象,对之后理解各种角频率的物理/数学含义最有帮助。
我们应该是在初中的时候第一次接触到三角函数,那时候三角函数的定义是直接给个三角形,然后直接定义 sin(cos) 为哪条边比哪条边的值,然后给出 sin(cos) 的波形如下图所示:
"Sine cosine one period" by Geek3 - Own work.
Licensed under CC BY 3.0 via Commons - https://commons.wikimedia.org/wiki/File:Sine_cosine_one_period.svg#/media/File:Sine_cosine_one_period.svg
当我们将这个三角形和单位圆联系在一起的时候,sin(cos) 的几何意义就很明显了:
"Circle-trig6" by This is a vector graphic version of Image:Circle-trig6.png by user:Tttrung which was licensed under the GFDL. Based on en:Image:Circle-trig6.png, which was donated to Wikipedia under GFDL by Steven G. Johnson. - This is a vector graphic version
of Image:Circle-trig6.png by user:Tttrung which was licensed under the GFDL. ; Based on en:Image:Circle-trig6.png, which was donated to Wikipedia under GFDL by Steven G. Johnson.. Licensed under CC BY-SA 3.0 via Commons - https://commons.wikimedia.org/wiki/File:Circle-trig6.svg#/media/File:Circle-trig6.svg
图中红 {MOD}的线段长度就是 sin 的值,蓝 {MOD}的线段长度就是 cos 的值,如果我们假设坐标系的原点和单位圆重合,脑补一下下面的场景:有个小球(只能)沿着单位圆的圆周做运动。这时候,我们就会发现一个事实:
sin(t) 是小球 t 时刻在 y 轴上的投影,cos(t) 是小球 t 时刻在 x 轴上的投影。
进一步,当小球的运动速率是匀速率的时候,就有了上面提到的波形,更加形象的图如下:
"Circle cos sin" by LucasVB - Own work. Licensed under Public Domain via Commons - https://commons.wikimedia.org/wiki/File:Circle_cos_sin.gif#/media/File:Circle_cos_sin.gif
P.S. 关于投影,wiki 上有个解释欧拉公式的图特别好:
"Sine and Cosine fundamental relationship to Circle (and Helix)" by Tdadamemd - Own work by uploader (.gif frames created in Powerpoint). Licensed under CC BY-SA 3.0 via Commons - https://commons.wikimedia.org/wiki/File:Sine_and_Cosine_fundamental_relationship_to_Circle_(and_Helix).gif#/media/File:Sine_and_Cosine_fundamental_relationship_to_Circle_(and_Helix).gif
有了上面简单的背景,就可以开始逐个讨论信号处理中的概念了。
Ω
我们已经知道小球在圆周上做匀速率的圆周运动时,它在两个坐标轴上的投影就分别是 sin(cos),如果我们想进一步描述小球的运动速率的快慢呢?
假设小球完整转一圈所花费的时间为 T,转动的角度为 2π,则我们可以定义
模拟角频率 Ω = 2π/T
,单位是 rad / s
来描述小球的转动速率的快慢。
当 t = 2π 时,y = sin(Ω*2π),这时候可以看出 Ω 的物理含义:
在 2π 的时间内,小球所完成的圈数。
下面的 Matlab 小程序演示了 2π 时间内 Ω 和周期的对应关系:
1
2
3
4
5
6
7
8
t = 0: pi/50: 2*pi;
for OMEGA = 1:4
y(:,OMEGA) = sin(OMEGA*t);
str{OMEGA} = ['OMEGA=', num2str(OMEGA)];
end
h = plot(t, y); grid on;
xlabel('t / s'); ylabel('amp'); title('y = sin(OMEGA*t)');
legend(h, str);
结果如下图:
f
小球在二维平面上的圆周运动投影到一维的坐标轴 x(y) 轴上看,则是左右(上下)振动。和 Ω 类似,我们也可以定义一个物理量来描述这种振动的快慢:
小球完成一次完整的圆周运动所花费的时间为 T,也就是完成一次振动花费了 T 时间,我们定义
频率 f = 1 / T
,单位是 Hz
来描述振动的快慢。由前面 Ω 的定义式可知,
Ω = 2π * f
,有 y = sin(2π * f * t)。
当 t = 1s 时,y = sin(2π * f),这时候可以看出 f 的物理意义:
在 1s 的时间内,小球所完成的振动次数。
下面的 Matlab 小程序演示了 1s 时间内 f 和振动周期的对应关系:
1
2
3
4
5
6
7
8
t = 0: 1/100: 1;
for f = 1:4
y(:,f) = sin(2*pi*f*t);
str{f} = ['f=', num2str(f)];
end
h = plot(t,y); grid on;
xlabel('t / s'); ylabel('amp'); title('y = sin(2*pi*f*t)');
legend(h, str);
结果如下图:
w
计算机的世界是离散的,所以当连续信号经过采样、量化得到离散信号后:
y = sin(Ω
t) = sin(Ωn
Ts) = sin(ΩTs
n) = sin(wn)
从数学上我们就可以得到:
数字角频率 w = Ω*Ts = Ω / Fs
,单位是 rad
可以看到,w 是用采样频率 Fs 对 Ω 进行归一化得到的,所以 w 准确地应该叫做归一化数字角频率。
连接模拟和数字的桥梁就是采样频率 Fs,由计算过程可以知道,w 相同的两个信号,它们的 Ω 不一定相同。因为丢失了 Fs 信息,所以单独讨论 w 是没有意义的。
虽然单独讨论 w 是没有意义的,但是这不代表 w 没有物理意义,当小球的振动频率为 f 时,每秒在圆周上转过的角度为 Ω = 2π * f,而采样频率为 Fs 就是说每秒钟对小球进行 Fs 次采样(拍照),显然有 Fs 个样值(照片)。这些样值(照片)是均匀分布的,所以每两个样值点之间的弧度为 2π * f / Fs = w,这也就是 w 的物理含义:
相邻两个样值点之间的弧度数。
================================== summary ====================================
这几个频率之间是线性关系,可以得到下面的对应关系:
Item |
Min |
Mid |
Max |
n
0
(N-1)/2
N
Ω
0
Ωs/2
Ωs
f
0
Fs/2
Fs
w
0
π
2*π
由频谱的搬移过程可以知道,w 从 π 到 2π 是负频率搬移的结果,所以通常分析的时候 w 的范围为 [-π, π),如下
Item |
Min |
Mid |
Max |
Ω
-Ωs/2
0
Ωs/2
f
-Fs/2
0
Fs/2
w
-π
0
π