資源簡介
基于STM32 DSP庫函數(shù)的電力諧波分析,輸入時(shí)域信號(hào)采樣值,進(jìn)行Q31 FFT計(jì)算,在有頻譜泄露、柵欄效應(yīng)的前提下計(jì)算基波和諧波的頻率、幅度、相位。根據(jù)論文《基于加漢寧窗的FFT高精度諧波檢測改進(jìn)算法》實(shí)現(xiàn)。函數(shù)void spectrum_with_cfft(q31_t * x_X, const int NPT,const float df,float Magnitude_harmonic[5],float Angle_harmonic[5],float f_harmonic[5])實(shí)現(xiàn)頻譜分析的功能,附帶測試信號(hào)的生成代碼
代碼片段和文件信息
//基于cfft的頻譜分析,RAM空間復(fù)雜度8*NPT
//頻譜分析方法文獻(xiàn):基于加漢寧窗的FFT高精度諧波檢測改進(jìn)算法
//reference:?STM32的DSP庫FFT函數(shù)?https://wenku.baidu.com/view/9cbc1a94eff9aef8951e061b.html
//輸入?yún)?shù):
//x_X:?of?size?2*NPT??
//????????作為輸入的ADC采樣數(shù)據(jù)時(shí),in?the?format?of?{adc00adc10adc20........}
//????????計(jì)算的頻域數(shù)據(jù)也存儲(chǔ)在x_X中??格式是{X[0]的實(shí)部,X[0]的實(shí)部,X[1]的實(shí)部,X[1]的虛部,X[2]的實(shí)部,X[2]的虛部,......}
//df:?頻率分辨率,等于采樣頻率除以采樣點(diǎn)數(shù)
//Magnitude_harmonic:?計(jì)算的基波及諧波的電壓有效值
//Angle_harmonic:?計(jì)算的基波及諧波的相位角
//f_harmonic:?計(jì)算的基波及諧波的頻率
void?spectrum_with_cfft(q31_t?*?x_X?const?int?NPTconst?float?dffloat?Magnitude_harmonic[5]float?Angle_harmonic[5]float?f_harmonic[5])
{
int?i;//時(shí)域信號(hào)的下標(biāo)
int?k;//頻域信號(hào)的下標(biāo)
//譜線鄰域分析用的變量
int?k0;//諧波譜線的理論下標(biāo)
const?int?harf_neighborhood=8;//正負(fù)15Hz鄰域?2/df
float?mag_neighborhood[harf_neighborhood*2+1];
float?ang_neighborhood[harf_neighborhood*2+1];
int?idx_harmonic;//諧波的下標(biāo)
float?max_mag;
int?kakm;
float?alpha_m;
float?dkm;
//加直流偏置
for(i=0;i {
//這里因?yàn)閱纹瑱C(jī)的ADC只能測正的電壓?所以需要前級(jí)加直流偏執(zhí)
//加入直流偏執(zhí)后,需要在軟件上減去2048即一半,達(dá)到負(fù)半周期測量的目的(需要根據(jù)具體情況來進(jìn)行配置)
//x[2*i]?=?((signed?short)(adc_buf[i]-2048))?<16;
//左移位數(shù)需要小于32-12,以避免定點(diǎn)FFT計(jì)算時(shí)溢出。
x_X[2*i]?=?((signed?short)(x_X[2*i]-2048))?<8;
x_X[2*i+1]=0;
}
//數(shù)據(jù)加窗,漢寧窗
for(i=0;i x_X[2*i]?=?x_X[2*i]*?0.5*(1-cos(2*PI*i/(NPT+1)));
arm_cfft_q31(&arm_cfft_sR_q31_len2048x_X01);
//計(jì)算的頻率、幅度、相位
for?(idx_harmonic=0;idx_harmonic<5;idx_harmonic++)
{
float?magnitude_XH5_kmangle_XH5_km;
if?(idx_harmonic==0)
{
//基波
k0=(idx_harmonic+1)*50/df;//諧波的序號(hào)的理論值
//計(jì)算諧波鄰域內(nèi)的幅度譜、相位譜
for?(k=k0-harf_neighborhood;k<=k0+harf_neighborhood;k++)
{
float?Xreal_k=x_X[2*k]/60.-(x_X[2*(k+1)]+x_X[2*(k-1)])/90.+(x_X[2*(k+2)]+x_X[2*(k-2)])/360.;
float?Ximag_k=x_X[2*k+1]/60.-(x_X[2*(k+1)+1]+x_X[2*(k-1)+1])/90.+(x_X[2*(k+2)+1]+x_X[2*(k-2)+1])/360.;
Xreal_k/=256;//與(adc_value-2048))?<8?對(duì)應(yīng)
Ximag_k/=256;//與(adc_value-2048))?<8?對(duì)應(yīng)
mag_neighborhood[k-k0+harf_neighborhood]=sqrt(Xreal_k*Xreal_k+Ximag_k*Ximag_k);//先不乘以2。實(shí)際上單邊譜cn是雙邊譜Fn的2倍
ang_neighborhood[k-k0+harf_neighborhood]=atan2(Ximag_kXreal_k)/PI*180;
}
//計(jì)算中心頻率、幅度、相位
//找到幅度極大譜線ka和臨建次大譜線kb取km=min(kakb)
max_mag=0;
for?(k=k0-harf_neighborhood;k<=k0+harf_neighborhood;k++)
{
if?(mag_neighborhood[k-k0+harf_neighborhood]>max_mag)
{
ka=k;
max_mag=mag_neighborhood[k-k0+harf_neighborhood];
}
}
if?(mag_neighborhood[ka-1-k0+harf_neighborhood] {
km=ka;
}
else
{
km=ka-1;
}
alpha_m=mag_neighborhood[km-k0+harf_neighborhood]/mag_n
評(píng)論
共有 條評(píng)論