【发布时间】: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 循环不正确地存在所以我猜这个语法是错误的?当我找到一个波时,我想停下来,即一个最大值、最小值和另一个最大值点,或者一个最小值、最大值和另一个最小值点。正弦数据有噪声,因此最小点和最大点不会相等,但是这种噪声非常小。
【问题讨论】:
-
我在基本理解方面遇到了问题...所以如果我将正弦波数据傅立叶变换到频率域,我只需要找到最大幅度的频率,这就是频率我的正弦波?
-
没错。如果您不想自己动手,可以使用许多免费的 fft 库。
标签: c arrays frequency wave trigonometry