【发布时间】:2011-10-17 15:44:19
【问题描述】:
我正在执行一项任务,以 20kHz 的采样频率对频率为 500Hz、幅度在 0 和 20 之间交替的方波执行 200 点 DFT。
我正在使用 C++,我已经想出了如何编写 DFT 方程,我的问题是我无法使用 for 循环在代码中表示方波。
我真正感到困惑的是,在我的 200 点样本中,这个方波有多少个周期。
谢谢
【问题讨论】:
标签: c++ visual-c++ signal-processing dft
我正在执行一项任务,以 20kHz 的采样频率对频率为 500Hz、幅度在 0 和 20 之间交替的方波执行 200 点 DFT。
我正在使用 C++,我已经想出了如何编写 DFT 方程,我的问题是我无法使用 for 循环在代码中表示方波。
我真正感到困惑的是,在我的 200 点样本中,这个方波有多少个周期。
谢谢
【问题讨论】:
标签: c++ visual-c++ signal-processing dft
方波的周期为20000/500=40 点,因此在 200 点样本 (200/40=5) 中,您将恰好有 5 个方波周期。
【讨论】:
一个周期的方波需要 1/500 秒。每个样本将是 1/20000 秒。一个简单的除法应该可以告诉您每个方波将有多少个样本。
另一个部门会告诉您有多少波浪适合您的 200 点窗口。
【讨论】:
如果您的采样频率为 20,000 Hz,并且您有一个频率为 500 Hz 的方波,这基本上意味着您将有 500 个周期的波每秒,这意味着您将在每 20,000 个样本中有 500 个周期。这意味着每个波周期需要 40 个样本(或点),因此如果您有 200 个点,则意味着您的 DFT 中应该有 5 个方波周期。
【讨论】:
您可以通过在计算中包含单位来确保您的计算正确无误。所以周期有时间维度,赫兹有1.0/次的维度,样本是无量纲的。 以编程方式,您可以使用boost.units 执行此操作。它会在编译时检查你的单元,如果你犯了错误,就会给你一个错误。
它还会阻止您的用户在您的代码中输入错误的单位。例如,输入 20 而不是 20000 作为频率(假设您以 kHz 为单位进行测量)
您的界面将类似于
using namespace boost::units;
set_period(quantity<si::time> period);
用户必须以秒为单位输入时间,
set_period(5*si::seconds)
【讨论】: