目錄
1.簡單介紹傅里葉變換的作用
2.諧波是什么
3.解決方法
1.簡單介紹傅里葉變換的作用
任何復雜的波形歸根結底都是由多個頻率和相位不一樣的正弦波組成的
通過傅里葉變換可以找到組成一個復雜的波形的所有正弦波的頻率和幅度信息
2.諧波是什么
假設有一個復雜的波形,它由多個正弦波有規律的疊加而成,且第一個正弦波頻率為5KHz,第二個正弦波為10KHz,第三個正弦波為15KHz……
可以發現后續的正弦波頻率都是第一個正弦波的整數倍,所以我們稱第一個正弦波為基波(或一次諧波),第二個正弦波為二次諧波,以此類推
使用STM32以合適的頻率對這個復雜的波形采樣(用數組A存儲),并將采樣得到的數據利用DSP數學庫中的快速傅里葉變換得到新的數據(也用數組B存儲),我們該如何正確找出各諧波的幅值呢?
3.解決方法
假設基波的幅值比其他諧波的幅值都要高
我們可以先通過大小比較確定基波(一次諧波)在數組B中的下標N,當我們確定基波在數組B的下標后,由于諧波的頻率必然是基波的整數倍,可以通過乘以基波下標的2倍、3倍、4倍……找到二次、三次、四次諧波……的位置是2N、3N、4N……
//假設基波的幅度高于直流分量和后續所有的諧波
//先找基波,假設B數組的長度為size
int i = 0;
int MAX_Location = 0; //存儲最大值所在位置
float MAX = B[0];
for( i = 0; i < size; i++)
{if( B[i] > MAX ){MAX = B[i];MAX_Location = i;}
}
但這樣的方法存在找不準的問題,比如二次諧波幅值實際是2V,由于采樣頻率問題,2倍的基波數組下標內存儲的幅值只有1V,真正的二次諧波在應該在2N-1或者2N+1,那么可以通過在2N的小范圍區間內再找一次最大值
當小區間內相鄰兩個值誤差在一定范圍內可視為由于采樣頻率的問題,其實在兩者間真正的最大值沒有采到,可以人為地在合適的范圍修正
int i = 0;
int Number = 0; //假設有Numer次諧波
int number = Number;
int arr[number] = {0}; //用于存儲每個諧波在B數組中的下標
float correction = 30; //人為修正剛好沒有采到最大值,而是采到左右兩個值的問題
float max = 0;number = 0;
for( i = 2; i < Number; i++)
{ max = B[Base_location * i - 2]; for( j = Base_location * i - 2; j < Base_location * i + 2; j++ ) //取±2的區間{if( fabs(arr[j] - arr[j + 1]) < 30) //修正{B[j] = (B[j] + B[j+1]) / 2 + 15;} if( B[j] > max ){max = B[j];arr[number] = j;number++;}}
}