C 正弦波阵列频率的确定

C 正弦波阵列频率的确定,c,arrays,frequency,wave,trigonometry,C,Arrays,Frequency,Wave,Trigonometry,我试图找到一种方法来计算正弦波的频率,它以数组的形式呈现,基于索引,通过取索引的差值。我知道两个相邻索引之间的时间,所以我可以将这个时间常数乘以两个最大点(或最小点)之间的索引差 我的做法如下: 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 mi

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

我的做法如下:

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 && max1 == min1 && max1 == 1 || min1 == max1 && min1 == min2 && min1 == 1)
{
    foundperiod = 1;
}

哦,是的,你不能那样用==的。C、 由于没有真正的类型安全性,很高兴地将布尔值转换为整数
a==b==c
编译为
(a==b==c
,其中a==b为0(false)或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

你的循环将退出。

Meet。我的基本计算有问题……所以如果我对正弦波数据进行傅里叶变换到频域,我只需要找到振幅最大的频率,这就是正弦波的频率?没错。如果您不想使用自己的fft库,可以使用很多免费的fft库;条件句是简单的整数。甚至C99的bool也是一种具有特殊属性的整数类型。深入研究C99标准:6.5.9(草案中)指出,等式运算符(即==和!=)的结果实际上是int。所以C99中也没有转换;-)。
( ( 0 == 1 ) == 0 ) == 1
( 0 == 0 ) == 1
1 == 1
1