私が開発した関数の問題のため、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> buffer
private:
に移動しました。また、コンストラクタに少し追加して、何個の配列要素を持つべきかを指定し、それらをすべて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;
}
'generic_fir_filter()'では、すべての 'buffer'要素をゼロに初期化するので、出力はゼロでなければなりません。しかし 'lpf_filter()'では、 'forward_buffer'の最初の要素だけをゼロに設定します。残りの部分が初期化された場所は表示されませんでした。 – Shibli
'.dat'ファイルの形式は?それはバイナリですか? 'input >> data'を実行するときに' input'ストリームでエラーをチェックしていますか? – qxz
迅速な応答の人々のためにありがとう。私はShibliの勧告が問題だと信じていますが、今私は別の問題があります!私はフィルタを通って私のデータを実行したが、出力されたフィルタリングされた値は、彼らがすべきであるものと比較して絶対に小さい。私はMatlabのバージョンとMatlabフィルタ(これはほぼ同じ係数が丸めを出すか丸める)と比較することでそれを二重にチェックし、同様の応答を生成しません。 – Vhaanzeit