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