在Matlab中以正好奈奎斯特速率进行采样

时间:2015-04-15 21:54:14

标签: matlab signal-processing sampling

今天我在matlab中偶然发现了一个奇怪的结果。假设我有一个正弦波,

f = 1;
Fs = 2*f;
t = linspace(0,1,Fs);    
x = sin(2*pi*f*t);
plot(x)

结果如图所示。

http://i.imgur.com/eUse3MO.jpg

当我设置时,

f = 100

结果如下图所示,

http://i.imgur.com/d5s5G0U.jpg

这究竟是什么原因?它是奈奎斯特采样定理,因此它应该正确地产生正弦。当然,当我采取 Fs>> f 我得到了更好的结果和非常好的正弦形状。我对自己的解释是,Matlab在浮动数字方面遇到了困难,但我不确定这是否属实。有人有什么建议吗?

5 个答案:

答案 0 :(得分:5)

在第一种情况下,您只生成2个样本(linspace的第三个输入是样本数),因此很难看到任何内容。

在第二种情况下,从0到1生成200个样本(包括这两个值)。因此采样周期为1/199,采样频率为199,略低于奈奎斯特速率。所以存在别名:你会看到频率为100的原始信号加上频率为99的别名。

换句话说:以下代码再现了您的第二个数字:

t = linspace(0,1,200);
x = .5*sin(2*pi*99*t) -.5*sin(2*pi*100*t);
plot(x)

上面的.5-.5源于这样的事实:正弦波可以被分解为正频率和负频率的两个频谱增量之和,并且这些增量的系数具有相反的符号。

这两个正弦波的总和相当于幅度调制,即由频率为1/2的正弦调制的频率为99.5的正弦波。由于时间跨度从0到1,调制器信号(其频率为1/2)仅完成半个周期。这就是你在第二个数字中所看到的。


为避免混叠,您需要将采样率提高到奈奎斯特速率以上。然后,要从其样本中恢复原始信号,您可以使用截止频率为Fs / 2的理想低通滤波器。但是,在您的情况下,由于您正在 奈奎斯特速率下采样,您将以频率100恢复信号,而是在频率99处恢复其别名。

如果您将高于奈奎斯特速率进行采样,例如Fs = 201,则可以从样本中理想地恢复原始信号但这需要一个几乎理想的低通滤波器,在通带和阻带之间有非常尖锐的转换。也就是说,别名现在处于频率101并且应该被拒绝,而所需信号将处于频率100并且应该被传递。

放宽过滤器要求,您需要远高于奈奎斯特率。这样,别名就会从信号中进一步说明,过滤器可以更轻松地将信号与别名分开。


这并不意味着图表看起来像原始信号(见SergV's answer);它只意味着在理想的低通滤波之后它将会出现。

答案 1 :(得分:4)

你的问题与奈奎斯特定理和混叠无关。这是图形表示的简单问题。您可以更改您的代码,正弦频率将低于奈奎斯特限制,但图形将像以前一样奇怪:

t = linspace(0,1,Fs+2);
plot(sin(2*pi*f*t));

结果:

解释问题我修改了你的代码:

Fs=100;
f=12;  %f << Fs
t=0:1/Fs:0.5; % step =1/Fs
t1=0:1/(10*Fs):0.5;   % step=1/(10*Fs) for precise graphic representation
subplot (2, 1, 1);
plot(t,sin(2*pi*f*t),"-b",t,sin(2*pi*f*t),"*r");
subplot (2, 1, 2);
plot(t1,sin(2*pi*f*t1),"g",t,sin(2*pi*f*t),"r*");

查看结果:

  • 红星 - sin(2 * pi * f)的值,采样率 Fs
  • 蓝线 - 连接红色星星的线条。它通常是函数 plot()的数据表示 - 数据点之间的行插值
  • 绿色曲线 - 罪(2 * pi * f)

你的眼睛和大脑很容易理解这些图表代表正弦

将频率更改为更高:

f=48;   % 2*f < Fs !!!

enter image description here

参见蓝线和红星。你的眼睛和大脑现在不明白这些图表代表相同的正弦。但是你的红星&#34;实际上是有效的正弦值。见下图。

最后,频率 f = 50 (2 * f = Fs)的正弦图形相同:

enter image description here

P.S。

Nyquist-Shannon采样定理为您的情况说明如果:

  1. f&lt; 2 * Fs的
  2. 您有无限个样本(我们的地块上的红色星星)
  3. 然后您可以随时重现功能值(我们的图上的绿色曲线)。您必须使用 sinc interpolation 来执行此操作。

答案 2 :(得分:0)

从Matlab帮助中复制:

linspace

生成线性间隔的向量 语法

y = linspace(a,b)
y = linspace(a,b,n)

描述

linspace函数生成线性间隔的向量。它类似于冒号运算符“:”,但可以直接控制点数。

y = linspace(a,b)生成一个100行点的行向量y,其间包含a和b。

y = linspace(a,b,n)生成n个点的行向量y,所述n个点在a和b之间线性地间隔开并且包括a和b。对于n < 2,linspace返回b。 实例

创建一个从1到500的100个线性间隔数字的向量:

A = linspace(1,500);

创建一个从1到36的12个线性间隔数字的向量:

A = linspace(1,36,12);

答案 3 :(得分:0)

对于奈奎斯特间隔,linspace不明显,因此您可以使用常见形式:

t = 0:Ts:1;

t = 0:1/Fs:1;

并更改Fs值。

第一个图是由于&#39; 0&#39;:sin(0)和sin(2 * pi)的近似值。我们可以注意到范围是10 ^( - 16)级。

答案 4 :(得分:0)

我编写了函数reconstruct_FFT,如果样本的输入序列是周期性的,即使是短的观察间隔也能恢复关键采样数据。它在频域中执行低通滤波。