【问题标题】:Finding frequency of a sine wave array寻找正弦波阵列的频率
【发布时间】:2014-03-19 10:43:39
【问题描述】:

我试图找到一种方法来计算以数组形式呈现的正弦波的频率,基于索引,通过取索引的差异。我知道两个相邻索引之间的时间,所以我可以将这个时间常数乘以两个最大点(或最小点)之间的索引差。

这是我的方法:

float find_freq(uint16_t array[500])
{
int i = 0;
int max1 = 0;
int max2 = 0;
int max1_index = 0;
int max2_index = 0;
int min1 = 0;
int min2 = 0;
int min1_index = 0;
int min2_index = 0;
int foundperiod = 0;
int samples = 0;

while(foundperiod == 0)
{
    uint16_t current_element = array[i];
    uint16_t next = array[i+1];
    if (current_element < next && min1 == 0)
    {
        min1 = 1;
        min1_index = i;
    }
    if (current_element > next && max1 == 0)
    {
        max1 = 1;
        max1_index = i;
    }
    if (current_element < next && min1 == 1)
    {
        min2 = 1;
        min2_index = i;

    }
    if (current_element > next && max1 == 1)
    {
        max1 = 1;
        max1_index = i;
    }
    i++;
    if (max1 == max2 == min1 == 1 || min1 == max1 == min2 == 1)
    {
        foundperiod = 1;
    }
}
if (max1 == max2 == min1 == 1)
{
    samples = max2_index - max1_index;

}
else if (min1 == max1 == min2 == 1)
{
    samples = min2_index - min1_index;
}

//Irrelevant part
uint16_t n = 55000;
int cycles = 3;
float frequency = 1 / (samples*(n/cycles));
return frequency;

}

在while循环退出之前的部分失败

if (max1 == max2 == min1 == 1 || min1 == max1 == min2 == 1)
    {
        foundperiod = 1;
    }

即使我的正弦波数组有正确的值,while 循环不正确地存在所以我猜这个语法是错误的?当我找到一个波时,我想停下来,即一个最大值、最小值和另一个最大值点,或者一个最小值、最大值和另一个最小值点。正弦数据有噪声,因此最小点和最大点不会相等,但是这种噪声非常小。

【问题讨论】:

  • Mr. Fourier
  • 我在基本理解方面遇到了问题...所以如果我将正弦波数据傅立叶变换到频率域,我只需要找到最大幅度的频率,这就是频率我的正弦波?
  • 没错。如果您不想自己动手,可以使用许多免费的 fft 库。

标签: c arrays frequency wave trigonometry


【解决方案1】:

运算符==返回逻辑结果0或1。

max1 == max2 == min1 == 1

将被解释为

( ( max1 == max2 ) == min1 ) == 1

min1等于0,max2等于1,max1等于0时,表达式将被计算为

( ( 0 == 1 ) == 0 ) == 1
( 0 == 0 ) == 1
1 == 1
1

你的循环将退出。

【讨论】:

    【解决方案2】:

    你可能想要

    if (max1 == max2 && max1 == min1 && max1 == 1 || min1 == max1 && min1 == min2 && min1 == 1)
    {
        foundperiod = 1;
    }
    

    【讨论】:

      【解决方案3】:

      哦,是的,你不能那样使用 ==。 C,不是真正的类型安全,很高兴将 bool 转换为 int。 a == b == c 编译为 (a==b) == c,其中 a==b 为 0(假)或 1。

      【讨论】:

      • 在较早的 C 实现中,没有 bool 开头,因此不会发生转换;条件是简单的整数。甚至 C99 的 bool 也是具有特殊属性的整数类型。
      • 深入研究 C99 标准:6.5.9(在草案中)指出等式运算符(即 == 和 !=)的结果实际上是 int。所以在 C99 中也没有转换;-)。
      猜你喜欢
      • 1970-01-01
      • 2015-12-16
      • 2023-04-06
      • 1970-01-01
      • 2012-01-31
      • 1970-01-01
      • 2019-12-12
      • 1970-01-01
      • 2017-04-10
      相关资源
      最近更新 更多