为什么matlab没有为16KHz的采样频率提供8KHz的正弦波?

时间:2014-09-04 05:43:58

标签: matlab signal-processing sampling sine

我有以下matlab代码,我试图在16KHz采样频率下获得64个不同正弦波频率的样本:

close all; clear; clc;
dt=1/16000;
freq = 8000;
t=-dt;
for i=1:64,
t=t+dt;a(i)=sin(2*pi*freq*t);
end
plot(a,'-o'); grid on; 

对于freq = 1000,输出图形为
enter image description here

图表似乎正常到2000,但在3000,图表是
enter image description here

我们可以看到每个周期中振幅的变化

同样,在4000处,图表为
enter image description here

不完全是一个正弦波,但是在每个周期中振幅都是预期的,如果我播放它听起来像一个单一的频率音调

但是在6000我们还有 enter image description here

在8000我们有 enter image description here

由于采样频率是16000,我假设我应该能够生成高达8000的正弦波样本,而我期望我得到的图表在4000处出现在8000处。相反,即使在3000,图表也开始看起来很奇怪

如果我将采样频率更改为32000并将正弦波频率更改为16000,我会获得与现在8000相同的图形。为什么matlab会以这种方式运行?

编辑:

at freq = 7900
enter image description here

3 个答案:

答案 0 :(得分:7)

这只是别名的神器。请注意8kHz图的垂直轴如何仅达到1.5E-13?理想情况下,图表应全为零;你所看到的是四舍五入错误。

查看以16kHz计算样本的表达式:

x(n) = sin(2 * pi * freq * n / 16000)

x是信号,n是整数样本编号,freq是以赫兹为单位的频率。因此,当freq为8kHz时,它等同于:

x(n) = sin(2 * pi * 8000 * n / 16000) = sin(pi * n)

因为n是一个整数,sin(pi * n)将始终为零。因此,8kHz被称为 Nyquist 频率,采样率为16kHz;通常,奈奎斯特频率始终是采样频率的一半。

在3kHz时,信号"看起来很奇怪"因为有些峰值处于16kHz的非整数倍,因为16不能被3整除。对于6kHz信号也是如此。

它们仍然听起来像纯正弦音的原因是因为样本之间的幅度插值。该图使用简单的线性插值,给出了样本边缘粗糙的印象。然而,物理扬声器(更确切地说,驱动它的电路)不直接使用线性插值。相反,使用一个小滤波器电路来平滑那些刺耳的边缘(又名抗锯齿),它消除了上述奈奎斯特频率以上的人为频率。

答案 1 :(得分:0)

这是matlab的问题,但却是抽样的本质。

16KHz采样每秒产生16K(16,000)个采样数据。 8KHz信号每秒钟有8K(8000)个周期。所以每个周期有两个样本数据。

两个是每个周期的最小数据量。这是“采样定理”的一部分。

让我们尝试在图表上显示两个带有三个点的循环,您可能会理解,不可能通过三个点显示两个循环。同样,您不能通过(2N-1)点显示2N个周期。

答案 2 :(得分:0)

8 kHz所见的效果是因为所有其他答案已经提到了混叠效应,并且由于8 kHz的正弦波为sin(2*pi*n*8000*1/16000) = sin(n*pi)而产生,这在Drew McGovens answer中有所解释。幸运的是,幅度并不是定义信号的唯一参数。完全定义信号所需的另一个参数是阶段。这意味着在对信号进行傅立叶分析时,仍然可以找到正确的频率。尝试:

close all; clear; clc;
dt=1/16000;
freq = 7300;
t=-dt;
for i=1:64,
    t=t+dt;a(i)=sin(2*pi*freq*t);
end
plot(a,'-o'); grid on;
figure; plot( linspace(1,16000,1000), abs(fft(a)) );

旁注:有些人可能反对使用i作为索引变量,因为它也可以用作想象数i。就个人而言,我没有反对使用i,因为运行时和开销仅受到轻微影响,我总是使用1i。但是,只需确保对假想单位使用1i