C ++中的抽取

时间:2017-03-11 00:06:19

标签: c++ arrays xcode signal-processing

亲爱的Stack社区,

我正在进行DSP练习,以补充我的C ++ FIR低通滤波器,滤波器系数设计在Matlab中并从Matlab导出。所讨论的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

1 个答案:

答案 0 :(得分:1)

问题:

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

在使用向量之前没有调整向量的大小,因此在分配decimated向量的元素0,1等时,您正在调用未定义的行为。

你可以做的就是循环,调用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;
}

decimated向量空白,但是push_back调用添加了一个新项目。

此外,您应该通过arr引用传递const向量,而不是按值传递。

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

传递(const)引用不会调用副本。

编辑:将循环计数器更改为正确的类型,因此不需要强制转换。