为什么matlab不给我一个8KHz正弦波用于16KHz的采样频率?

use*_*267 2 matlab trigonometry signal-processing sampling

我有以下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; 
Run Code Online (Sandbox Code Playgroud)

对于freq = 1000,输出图是
在此输入图像描述

图表似乎正常到2000,但在3000,图表是
在此输入图像描述

我们可以看到每个周期的振幅都会发生变化

同样,在4000处,图表是
在此输入图像描述

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

但我们再次在6000
在此输入图像描述

我们有8000
在此输入图像描述

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

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

编辑:

在freq = 7900
在此输入图像描述

Dre*_*wen 7

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

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

x(n) = sin(2 * pi * freq * n / 16000)
Run Code Online (Sandbox Code Playgroud)

x信号在哪里,n是整数样本号,freq是以赫兹为单位的频率.所以,当freq它是8kHz时,它相当于:

x(n) = sin(2 * pi * 8000 * n / 16000) = sin(pi * n)
Run Code Online (Sandbox Code Playgroud)

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

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

它们仍然听起来像纯正弦音的原因是因为在样本之间如何插值幅度.该图使用简单的线性插值,给出了样本边缘粗糙的印象.然而,物理扬声器(更准确地说,驱动它的电路)不直接使用线性插值.相反,使用小滤波器电路来平滑那些刺眼的边缘(也称为抗混叠),其去除高于上述奈奎斯特频率的人工频率.