私は、振幅が0と20の間で交互になる周波数500Hzの方形波で、サンプリング周波数20kHzで200ポイントのDFTを実行する割り当てに取り組んでいます。
私はC++を使用しており、DFT方程式をコーディングする方法を理解しました。私の問題は、forループを使用してコードで方形波を表現するのに問題があることです。
私がまだ本当に混乱しているのは、この方形波のサイクルが200ポイントのサンプルにいくつあるかということです。
ありがとう
私は、振幅が0と20の間で交互になる周波数500Hzの方形波で、サンプリング周波数20kHzで200ポイントのDFTを実行する割り当てに取り組んでいます。
私はC++を使用しており、DFT方程式をコーディングする方法を理解しました。私の問題は、forループを使用してコードで方形波を表現するのに問題があることです。
私がまだ本当に混乱しているのは、この方形波のサイクルが200ポイントのサンプルにいくつあるかということです。
ありがとう
方形波の周期は20000/500=40ポイントであるため、200ポイントのサンプルには正確に5つの方形波の周期があります(200/40=5)。
方形波の1サイクルは1/500秒かかります。各サンプルは1/2000秒になります。単純な除算により、各方形波のサンプル数がわかります。
別の部門では、これらの波のいくつが200ポイントのウィンドウに収まるかを示します。
サンプリング周波数が20,000Hzで、周波数が500 Hzの方形波がある場合、これは基本的に1秒あたり500サイクルの波があることを意味します。つまり、20,000サンプルごとに500サイクルになります。これは、各波サイクルに40サンプル(またはポイント)が必要であることを意味します。したがって、200ポイントがある場合、DFT内に5つの方形波サイクルが必要であることを意味します。
計算に単位を含めることで、計算が正しく行われるようにすることができます。したがって、期間には次元時間があり、ヘルツには1.0 /時間の次元があり、サンプルには無次元があります。プログラム的には、 boost.unitsを使用してこれを行うことができます。コンパイル時にユニットをチェックし、間違えるとエラーが発生します。
また、ユーザーがコードに間違った単位を入力するのを防ぎます。たとえば、周波数に20000ではなく20を入力することにより(kHzで測定していると考えて)
インターフェースは次のようになります
using namespace boost::units;
set_period(quantity<si::time> period);
ユーザーは秒単位で時間を入力する必要があります、
set_period(5*si::seconds)