2017-03-11 16 views
0

親愛なるスタックコミュニティ、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

+0

'decimated [n_idx ++] = arr [i];' - あなたの 'decimated'ベクトルは空です。そのような空のベクトルの項目にはアクセスできません。その行を 'decimated.at(n_idx ++)= arr [i]; 'に置き換えると、アクセス違反エラーよりもはるかに有益な' out_of_range'例外が発生します。 – PaulMcKenzie

+0

このような迅速な対応は期待できませんでした。迅速な返答をいただきありがとうございます。これは概念的には本当に有益ですが、ルーキーエラーのように思えます。これに対する解決策を見つけようとします!乾杯! – Vhaanzeit

答えて

1

問題:

size_t n_idx = 0; 
std::vector<float> decimated(n_idx); 

あなたがそれを使用する前に、サイズベクトルしなかった要素0、1を割り当てるときので、あなたは未定義の動作を起動して、などのdecimatedベクター。ループの中で何が行われている可能性が

push_backを呼び出す:decimatedベクトルが空から始まりますが、新しいアイテムがpush_backコールが追加され

std::vector<float> decimated_array(int M,std::vector<float> arr) 
{ 
    std::vector<float> decimated; 
    for (size_t i = 0; i < arr.size(); i = i + M) { 
     decimated.push_back(arr[i]); 
    } 
    return decimated; 
} 

また、arrベクトルを値ではなくconstという参照で渡す必要があります。

std::vector<float> decimated_array(int M, const std::vector<float>& arr); 

(const)参照を渡してもコピーは呼び出されません。

編集:タイプを修正するためにループカウンタを変更しました。したがって、キャストは必要ありません。

+0

助けを大変感謝します。私はこれがC++になじみのないものになると思う。私は伝統的なCの考え方ではあまりにも多すぎることを考えてきましたが、それはここでの問題です。これらのテンプレートの使用にもう少し慣れておく必要があります。もう一度本当に感謝! – Vhaanzeit

+0

@ Vhaanzeit男性にアップヴォートを与え、その答えが助けられて問題を解決した場合は、解決したとしてマークします。 – user4581301

関連する問題