【问题标题】:Rectifying a Waveform (array of numbers) for Average,RMS and no. of zero crossings c++为平均值、RMS 和否校正波形(数字数组)。零交叉 C++
【发布时间】:2015-03-26 13:30:16
【问题描述】:

我有来自三个不同波形的 3 个数字数组。

我需要校正每个波形(因此负值变为等效的正值)并使用 3 个不同的函数找到每个波形的平均值、RMS 和过零次数。

据我所知,我的功能已设置完毕。

但是,我将如何纠正这些波形?

#include <iostream>
#include <cmath>
using namespace std;
#define SIZE1 80
#define SIZE2 62
#define SIZE3 29
double findAverage(short array[], int size);
double findRMS(short array[], int size);
unsigned findZeroCrossings (short array[], int size);

int main()
{
    // array of values in cosine waveform //
    short cosine[SIZE1] = {
    32767, 32666, 32364, 31862, 31163, 30273, 29196, 27938, 26509, 24916,
    23170, 21280, 19260, 17121, 14876, 12539, 10126, 7649, 5126, 2571,
    0, -2571, -5126, -7649, -10126, -12539, -14876, -17121, -19260,     -21280,
    -23170, -24916, -26509, -27938, -29196, -30273, -31163, -31862, -32364, -32666,
    -32767, -32666, -32364, -31862, -31163, -30273, -29196, -27938, -26509, -24916,
    -23170, -21280, -19260, -17121, -14876, -12539, -10126, -7649, -5126, -2571,
    0, 2571, 5126, 7649, 10126, 12539, 14876, 17121, 19260, 21280,
    23170, 24916, 26509, 27938, 29196, 30273, 31163, 31862, 32364, 32666
    };
    // array of values in triangle waveform //
    short triangle[SIZE2] = {
    15500, 14500, 13500, 12500, 11500, 10500, 9500, 8500, 7500, 6500,
    5500, 4500, 3500, 2500, 1500, 500, -500, -1500, -2500, -3500,
    -4500, -5500, -6500, -7500, -8500, -9500, -10500, -11500, -12500, -13500,
    -14500, -15500, -14500, -13500, -12500, -11500, -10500, -9500, -8500, -7500,
    -6500, -5500, -4500, -3500, -2500, -1500, -500, 500, 1500, 2500,
    3500, 4500, 5500, 6500, 7500, 8500, 9500, 10500, 11500, 12500,
    13500, 14500
    };
    // array of values in sawtooth waveform //
    short sawtooth[SIZE3] = {
    -24000, -22000, -20000, -18000, -16000, -14000, -12000, -10000, -8000, -6000,
    -4000, -2000, 0, 2000, 4000, 6000, 8000, 10000, 12000, 14000,
    16000, 18000, 20000, 22000, 24000, 26000, 28000, 30000, 32000
    };

    // TODO
}

double findAverage(short array[], int size)
{
    int i;
    int sum = 0;
    double average;
    for (i = 0; i < size; ++i)
    {
        sum += array[i];
    }
    average = double(sum) / size;
    return average;
}

double findRMS(short array[], int size)
{
    int i;
    double sumsquared;
    double RMS;
    sumsquared = 0;
    for (i = 0; i < size; i++)
    {
        sumsquared += array[i]*array[i];
    }
    RMS = sqrt((double(1)/size)*(sumsquared));
    return RMS;
}

unsigned findZeroCrossings(short array[], int size)
{
     int zeroCrossings = 0;
     for (int i = 0; i + 1 < size; i++) 
     {
         if ((array[i] >= 0) && (array[i + 1]) < 0)
             zeroCrossings++;
         if ((array[i] < 0) && (array[i + 1] >= 0))
             zeroCrossings++;
     }
     return zeroCrossings;
}

【问题讨论】:

  • 除了RMS,这和C++有什么关系吗?也许它更适合 DSP 堆栈交换?
  • 我必须使用 c++ 来完成这项任务。 @米哈伊尔
  • 仅供参考,除了未使用的包含之外,您的代码是 C 而不是 C++

标签: c++ arrays waveform


【解决方案1】:

如果您的整改只是为了获得数据点的绝对值,那么只需重写它们。

类似这样的:

void rectify(short *array, int size)
{
    int i;
    for (i = 0; i < size; ++i)
        if(array[i] < 0)
            array[i] *= -1;
}

如何在这种情况下使用它。把这些放在main函数的最后:

printf("Avg of sawtooth: %f\n", findAverage(sawtooth, SIZE3));
rectify(sawtooth, SIZE3); // Note: the sawtooth array changed.
printf("Avg of rectified sawtooth: %f\n", findAverage(sawtooth, SIZE3));

【讨论】:

  • 那么在整改部分使用一个函数会更好吗? @Koshinae
  • 这取决于你的需要 :) 这个函数替换了原地的值。如果您希望保留原始数据,则需要另一个数组并将所有值复制到那里。
  • 那么,如果我想通过新的“整流数组”运行我的三个函数,我该怎么做呢?我有点 C++ 初学者.. @Koshinae
  • 这样,你首先调用rectify,这将改变你调用它的数组。然后您只需调用这三个函数,它们的结果将基于校正后的数组。我认为findZeroCrossings 不会在整流后的波形上产生任何结果。
  • 你能给我看一个 rectify 调用的例子吗?我想这会对我有很大帮助! @Koshinae
猜你喜欢
  • 2019-12-21
  • 1970-01-01
  • 1970-01-01
  • 2013-03-11
  • 1970-01-01
  • 1970-01-01
  • 2022-12-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多