【问题标题】:Why doesn't matlab give me an 8KHz sinewave for 16KHz sampling frequency?为什么 matlab 不给我一个 16KHz 采样频率的 8KHz 正弦波?
【发布时间】:2014-09-04 05:43:58
【问题描述】:

我有以下 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,输出图为

该图在 2000 年之前看起来很正常,但在 3000 年,该图是

我们可以看到每个周期的幅度都在变化

同样,在 4000 处,图表是

不完全是正弦波,但幅度在每个周期中都符合预期,如果我播放它,它听起来像是单频音

但在 6000 处,我们又有了

在 8000 我们有

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

如果我将采样频率更改为 32000,将正弦波频率更改为 16000,我会得到与现在 8000 相同的图表。为什么 matlab 会这样?

编辑:

频率 = 7900

【问题讨论】:

  • 只是为了好玩,将cos 绘制在sin 旁边,您会在 8kHz 处看到一些东西。

标签: matlab signal-processing sampling trigonometry


【解决方案1】:

这只是别名的产物。请注意 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 被称为奈奎斯特频率,采样率为 16kHz;一般来说,奈奎斯特频率总是采样频率的一半。

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

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

【讨论】:

  • 这是否意味着只要我在 16K 采样频率下工作,我就无法获得 8K 正弦波的样本?我认为如果采样频率至少是输入中存在的最大频率的两倍,那么从它的样本中重新创建输入就足够了。我认为这意味着对于 16kHz 的采样频率,我应该能够获得高达 8kHz 的正弦波样本。我哪里做错了?
  • 这是一个边界情况;使用 16K 采样率,您可以达到,但包括 8K,这正是我在 8K 时用全零演示的原因。低于 8K 的频率在技术上还不错,但开始看起来像是淡入淡出。
  • 那我们能确定在16kHz时可以产生的最大频率样本吗?是否有可能低于 8kHz?我将图表添加到问题中的 7900
  • 这显然不是正弦波,但也不是 0。这也可以通过 matlab 中插值的限制来解释吗?由于上述原因,播放它听起来仍然像纯音吗?
  • 我不记得确切的公式,但它基本上是样本总数的函数,它给出了您可以准​​确重建的最高频率。类似于8000 - 8000 / numberOfSamples
【解决方案2】:

这是matlab的问题,是采样的本质。

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

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

让我们尝试在图上用三个点显示两个循环,您可能会理解不可能用三个点显示两个循环。同理,你不能用 (2N-1) 个点来显示 2N 个循环。

【讨论】:

    【解决方案3】:

    看到 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 始终用于虚数单位。

    【讨论】:

      猜你喜欢
      • 2015-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      相关资源
      最近更新 更多