2017-03-13 8 views
0

私が開発した関数の問題のため、C++でファイルにデータを書き込む際に問題があります。外部ソースから.datファイルをC++プロジェクトにロードします。適切に開発されたwhileループは、線で各データ要素の行を読み取り、三つのパラメータ、すなわち、フィルタ長、フィルタ係数std::vector<float>をとるFIRフィルタ関数に渡しとfloat dataデータ生成の問題

float f0 = 8000; 
float fs = 32000; 
int filt_length = 21; 
float filtered,data; 
fir_lowpass windowed_filter(f0,fs); 

std::ifstream input; 
std::ofstream output; 
input.open("chirp.dat"); 
output.open("filter_test_sig.dat"); 

std::vector<float> blackman_choice,basic_lpf; 

basic_lpf = windowed_filter.fir_sinc_filter_weights(filt_length); 

blackman_choice = windowed_filter.blackman_window(filt_length, basic_lpf); 

if (input.fail() && output.fail()) { 
    std::cout << "Files not opened." << std::endl; 
} 
else{ 
    while (input >> data) { 
     filtered = windowed_filter.generic_fir_filter(filt_length, blackman_choice, data); 
     output << filtered << std::endl; 
     std::cout << filtered << std::endl; 
    } 
} 

私はこのことが確認されましたループは実際にはあまり複雑でないFIRフィルターヘッダーファイルを持っているので意図どおりに機能します。 array Bが事前定義され、Matlabの内部計算およびエクスポートされること

float lpf_filter(float input){ 

    forward_buffer[0] = input; 
    float output; 

    for (int i = 0; i<filter_length; i++) { 
     output += B[i]*forward_buffer[i]; 
    } 
    for (int i = filter_length-1; i>0; i--) { 
     forward_buffer[i] = forward_buffer[i-1]; 
    } 
    return output; 
} 

注:ここで、前述のコードで動作し、元の関数です。次の関数では、すでに計算された係数を別の関数から取得するようにこの関数を書き直そうとしました。ここで、コードとその下の例係数関数(float output = 0更新)がある:

float generic_fir_filter(const std::vector<float> &coefficients, float input){ 
    std::vector<float> buffer(coefficients.size(),0.0f); 
    buffer[0] = input; 
    float output = 0; 

    for (int i = 0; i<(int)coefficients.size(); i++) { 
     output += coefficients[i]*buffer[i]; 
    } 
    for (int i = (int)coefficients.size()-1; i>0; i--) { 
     buffer[i] = buffer[i-1]; 
    } 
    return output; 
} 
std::vector<float> fir_sinc_filter_weights(int filt_length){ 
    std::vector<float> w(filt_length); 
    M = filt_length-1; 

    for (int i = 0; i<filt_length; i++) { 
     if (i == M/2) { 
      w[i] = 2*fn; 
     } 
     else{ 
      w[i] = sin(2*M_PI*fn*(i-M/2))/(M_PI*(i-M/2)); 
     } 
    } 
    return w; 
} 

.cppファイル内のループはそれだけで、一方各ループ反復について同じフィルタ値を生成している間、私は私の内側内部この機能を実行すると、私元の機能はありませんでした。私はまた、ロードされた.datファイルをstd::vector<float>に変換し、一度に1つずつサンプルをロードしようとしましたが、これはうまくいきませんでした。この問題の助けをいただければ幸いです。

EDIT:

は、私は今、バッファ内の前の残りの状態を維持しようとする試みで私のstd::vector<float> bufferprivate:に移動しました。また、コンストラクタに少し追加して、何個の配列要素を持つべきかを指定し、それらをすべて0に初期化するようにしました。

private: 
    int M; 
    float fn; 
    std::vector<float> buffer; 
public: 
fir_lowpass(float f0,float fs,int weight_size){ 
    fn = f0/fs; 
    std::vector<float> buffer(weight_size, 0.0f); 
} 
float generic_fir_filter(const std::vector<float> &coefficients, float input){ 
    //std::vector<float> buffer(coefficients.size(),0.0f); 
    buffer[0] = input; 
    float output = 0; 

    for (int i = 0; i<(int)coefficients.size(); i++) { 
     output += coefficients[i]*buffer[i]; 
    } 
    for (int i = (int)coefficients.size()-1; i>0; i--) { 
     buffer[i] = buffer[i-1]; 
    } 
    return output; 
} 
+0

'generic_fir_filter()'では、すべての 'buffer'要素をゼロに初期化するので、出力はゼロでなければなりません。しかし 'lpf_filter()'では、 'forward_buffer'の最初の要素だけをゼロに設定します。残りの部分が初期化された場所は表示されませんでした。 – Shibli

+0

'.dat'ファイルの形式は?それはバイナリですか? 'input >> data'を実行するときに' input'ストリームでエラーをチェックしていますか? – qxz

+0

迅速な応答の人々のためにありがとう。私はShibliの勧告が問題だと信じていますが、今私は別の問題があります!私はフィルタを通って私のデータを実行したが、出力されたフィルタリングされた値は、彼らがすべきであるものと比較して絶対に小さい。私はMatlabのバージョンとMatlabフィルタ(これはほぼ同じ係数が丸めを出すか丸める)と比較することでそれを二重にチェックし、同様の応答を生成しません。 – Vhaanzeit

答えて

0

私はstd:vector<float> bufferを呼び出し、設定の問題の解決策を見つけた:問題は今、私は私のgeneric_fir_filter()内部バッファのために呼び出したとき、私は上記の関数の内部buffer[0] = input;のために呼び出したとき、私はEXC_BAD_ACCESSエラーを取得していますその配列のサイズは私が必要とするところまでです。トリックはprivate:にし、その後、コンストラクタ設定でバッファを宣言し、コンストラクタ名の横に、次の:操作を介してバッファを初期化することです。すべての人の助けを

private: 
int M; 
float fn; 
std::vector<float> buffer; 
public: 
fir_lowpass(float f0,float fs,int weight_size) : buffer(weight_size, 0.0f) 
{ 
    fn = f0/fs; 
    //std::vector<float> buffer2(weight_size, 0.0f); 
} 

ありがとう!

関連する問題