首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数据生成问题

数据生成问题
EN

Stack Overflow用户
提问于 2017-03-13 20:11:25
回答 1查看 65关注 0票数 0

我在将数据写入C++文件方面遇到了问题,因为我开发了一个函数。我从外部源将.dat文件加载到我的C++项目中。同时循环正确地逐行读取每个数据元素,并将其传递给FIR滤波器函数,该函数包含三个参数,即滤波器长度、滤波系数std::vector<float>float data

代码语言:javascript
复制
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过滤器头文件。下面是与上述代码一起工作的原始函数:

代码语言:javascript
复制
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;
}

请注意,array B是预先定义的,并在Matlab中进行计算并导出。在下一个函数中,我尝试重写这个函数,以便从另一个函数中获取已经计算过的系数。下面是代码和它下面的一个示例系数函数(更新的float output = 0):

代码语言:javascript
复制
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文件的内部while循环中运行这个函数时,它只为每个循环迭代生成相同的过滤值,而我的原始函数没有。我还将加载的.dat文件转换为std::vector<float>,并试图一次加载一个示例,但这也不起作用。在这件事上有任何帮助将是非常感谢的!

编辑:

现在,我已经将我的std::vector<float> buffer移动到private:中,试图将前一个剩余的状态保存在缓冲区中。我还在构造函数中添加了一个小的附加项,以告诉std::vector<float> buffer它应该有多少数组元素,并将它们初始化为零。现在的问题是,当我在generic_fir_filter()中调用缓冲区时,当我在上述函数中调用buffer[0] = input;时,会得到一个EXC_BAD_ACCESS错误:

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

发布于 2017-03-14 14:50:49

我找到了调用std:vector<float> buffer并将其数组大小设置为任何需要的问题的解决方案。诀窍是在private:中声明缓冲区,然后在构造函数设置中声明缓冲区,并通过构造函数名称旁边的以下:操作初始化缓冲区:

代码语言:javascript
复制
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);
}

谢谢大家的帮助!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42772574

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档