親愛なるスタックコミュニティ、C++の間引き
Matlabで設計されたフィルタ係数を使用してエクスポートされたC++ FIRローパスフィルタを補うDSP練習をしています。問題のDSP演習は、FIRローパス・フィルタの出力配列を「M」の係数でより低いサンプル・レートにデシメートする行為です。 C++では、.cppファイル内で成功したものの、非常に単純な実装を行いました.FIRフィルタの出力配列に与えることができる関数に変換しようと努力してきました。ここにコードの非常に基本的なバージョンがあります:
int n = 0;
int length = 50;
int M = 12;
float array[length];
float array2[n];
for (int i = 0 ; i<length; i++) {
array[i] = std::rand();
}
for (int i = 0; i<length; i=i+M) {
array2[n++] = array[i];
}
for (int i = 0; i<n; i++) {
std::cout << i << " " << array2[i] << std::endl;
}
非常に簡単に見ることができます。これを関数に変換しようとする私の試みは、残念ながら動作しません。
std::vector<float> decimated_array(int M,std::vector<float> arr){
size_t n_idx = 0;
std::vector<float> decimated(n_idx);
for (int i = 0; i<(int)arr.size(); i = i + M) {
decimated[n_idx++] = arr[i];
}
return decimated;
}
.cppファイル内のコードのこのセクションを使用する場合はEXC_BAD_ACCESSの非常に一般的なXcodeのエラーを生成します。あるとしてここでは関数です。このエラーは、「decimated [n_idx ++] = arr [i];」という行にあります。具体的には:
int length = 50;
int M = 3;
std::vector<float> fct_array(length);
for (int i = 0 ; i<length; i++) {
fct_array[i] = std::rand();
}
FIR_LPF test;
std::vector<float> output;
output = test.decimated_array(M,fct_array);
私のアプリケーションやアルゴリズムの翻訳では、より一般的な設定になっていることを理解しようとしています。この問題に関するいかなる助力も大いにありがたく思っています。うまくいけば、これはコミュニティが理解するのに十分です。
よろしく、Vhaanzeit
'decimated [n_idx ++] = arr [i];' - あなたの 'decimated'ベクトルは空です。そのような空のベクトルの項目にはアクセスできません。その行を 'decimated.at(n_idx ++)= arr [i]; 'に置き換えると、アクセス違反エラーよりもはるかに有益な' out_of_range'例外が発生します。 – PaulMcKenzie
このような迅速な対応は期待できませんでした。迅速な返答をいただきありがとうございます。これは概念的には本当に有益ですが、ルーキーエラーのように思えます。これに対する解決策を見つけようとします!乾杯! – Vhaanzeit