當前位置:首頁 » 操作系統 » 過濾低頻演算法

過濾低頻演算法

發布時間: 2022-07-30 14:19:01

A. 電容串聯可以濾低頻,並聯可以濾高頻,應用多大的電容在濾高頻時,對低頻影響大嗎電感可以濾高頻嗎

濾波電容的容抗演算法:Xc=1/2πfC,可以根據Xc的值來計算,這不是個定值,因為Xc隨著頻率的變化而變化,如果是單個電容作用,那麼根據上式可以分析:式中1/2πC是個定值設它為A,那麼Xc=1/2πfC=A/f,可以看出,容抗Xc和頻率成倒數的關系,即頻率越高 Xc越小,頻率越低Xc越大,也就是電容對低頻呈現的阻抗比高頻大,所以用單個電容濾波效果不是很好,因為Xc和頻率是線性關系,為了濾掉某低頻,也同時阻礙個高頻。
電感的作用和電容正好相反,感抗 XL=2πfL,可以看出感抗與頻率成正比的關系,即頻率越高 XL越大,頻率越低XL越小,也就是電感對高頻呈現的阻抗比低頻大。所以單個電感濾波效果也不好。
一般濾波比較好的是採用LC串聯或並聯,更好的是有源濾波器,即帶通濾波器。
濾波器一般是接在信號輸入端,效果較好。但也有接在負載端的,例如音箱的分頻器。
用電容濾波時,電容串聯在電路中和並聯在電路中效果是相反的,例如電容並聯,是濾除高頻信號,而電容串聯是濾除低頻信號。
用電感濾波時,電感串聯在電路中和並聯在電路中效果也是相反的,例如電感並聯,是濾除低頻信號,而電感串聯是濾除高頻信號。
濾波電感或電容的選擇是根據電路要求確定的,例如在某頻段內要求需要放大信號(50Hz-15KH)的增益40db,不需要放大信號(15K以上)的增益20db,利用上式可以粗略估算。實際使用中濾波器的接入,總要損失放大量的,也很難做到一個頻段內的增益相等。

B. 如何過濾低頻信號

不知道樓主的實際電路是怎麼樣的。
最簡單的方法,將交流信號經過一個阻容的高通濾波網路,之後再與12VDC信號疊加,阻容的取值需要注意,可以自己計算或者用模擬工具仿一下(推薦Multisim)。

C. 電容是怎麼濾去低頻信號的

百分之百濾除是不可能的,但是你知道濾波原理,你就會不會問這樣的問題了。
將電容與電阻串聯,接在信號源輸出端。
三者是串聯電路,滿足歐姆定律,不過你要會計算容抗,容抗是與頻率有關的。頻率越高容抗越小。
信號源輸出的是混合頻率信號,有高頻有低頻,
1、如果你從電容兩端引出(取電容兩端的電壓作後級輸入)則是低通濾波器,因為高頻信號在電容上的容抗小,在電容上的電壓遠小於電阻上的電壓。而低頻信號在電容上的容抗大,在電容上的電壓遠大於高頻時的電壓。
2、如果從電阻兩端引出,則成了高通濾波器,原理是類似的。

D. 淺談為什麼大電容濾低頻小電容濾高頻的問題

際的電容由於存在電感效應通常需要等效成一個電容、一個電感和一個電阻的串聯形式, 實際的阻抗為:
Z=R+jωL+1/jωC=R+j(ωL-1/ωC)由上式知,當f=ω/2π=1/(2πsqrt(LC)) 時,電容大的實際阻抗值小,此時的頻率稱為電容的自諧振頻率,記為f0,當頻率大於f0時,電容實際呈現出容性阻抗,當頻率小於f0時,電容實際呈現出感性阻抗。電源濾波主要利用電容的隔直流、通交流的特性,干擾信號的頻率越靠近電容的自諧振頻率,干擾信號越容易被電容徹底過濾掉。大容值的電容通常具有較大的等效電感,因而其自諧振頻率較小,所以比較適合用於濾除低頻干擾雜訊;小容值的電容通常等效電感也較小,因此自諧振頻率較大,所以適合用於濾除高頻干擾雜訊。 大容量的電容由於製造工藝限制存在比較大的電感,所以濾高頻波反而用小電容;濾低頻波用大電容主要是為了負載的電流足夠和紋波足夠小,如果不管這些,濾低頻波也可以用小電容。

E. 分別利用線性表和二叉排序樹來實現單詞頻率的統計,實現低頻詞的過濾,並比較兩種方法的效率

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#include<time.h>
#define maxqsize 9000
typedef struct vnode{
char word[16];
int count;
vnode* next;
}*linklist;
typedef struct tree{
char word[16];
int count;
tree *lcchild,*rcchild;
}*Bitree,*queueelem;
typedef struct queue{
queueelem *data;
int rear,front,tag;//tag 為判斷隊的狀態1為滿 0為空
};
void inordertraverse(Bitree r,FILE* fp)//中序遍歷輸出結果到文檔
{
if(r==NULL)return;
inordertraverse(r->lcchild,fp);
printf("%-16s%3d\n",r->word,r->count);
fprintf(fp,"%-16s%3d\n",r->word,r->count);
inordertraverse(r->rcchild,fp);
}
void initqueue(queue &q){
q.data=(queueelem *)malloc(maxqsize*sizeof(queueelem));
q.tag=q.front=q.rear=0;
return;
}
void enqueue(queue &q,queueelem e)
{
if(q.tag==1)return;
q.data[q.rear]=e;
q.rear=(q.rear+1)%maxqsize;
if(q.rear==q.front)q.tag=1;
else q.tag=2;
}
void dequeue(queue &q,queueelem &e)
{
if(q.tag==0)return;
e=q.data[q.front];
q.front=(q.front+1)%maxqsize;
if(q.rear==q.front)q.tag=0;
else q.tag=2;
}
linklist head;
Bitree root=(Bitree)malloc(sizeof(tree)),root2;
int main()
{
void start();
start();
}
void start()
{
int i;
void biao();
void bitree();
while(true)
{
system("cls");
printf("統計低頻詞彙\n");
printf("1.線性表\n");
printf("2.二叉排序樹\n");
printf("3.退出\n");
printf("鍵入數字1-3,選擇需要進入的功能界面\n");
printf("\n");
while(scanf("%d",&i),i<1&&i>3);
switch(i)
{
case 1:biao();break;
case 2:bitree();break;
case 3:return;
}
}
}
void biao()
{
void basl();
system("cls");
int i;
void jm1();
void jm2();
while(true)
{
system("cls");
printf("統計低頻詞彙\n");
printf("1.連續執行並顯示時間\n");
printf("2.分步執行\n");
printf("3.計算ASL\n");
printf("4.返回主菜單\n");
printf("\n");
while(scanf("%d",&i),i<1&&i>4);
switch(i)
{
case 1:jm1();break;
case 2:jm2();break;
case 3:basl();break;
case 4:return;
}
}
}
void bread()
{
char a [99999];
FILE* fp=fopen("D:\\data\\InFile.txt","r");
//if(fp)printf("讀取文件成功\n");
char ch[35],str[16];linklist p,q;int i,j;
head=(linklist)malloc(sizeof(vnode));
head->next=NULL;
while(~fscanf(fp,"%s",ch))
{
j=0;
for(i=0;;i++)
if(isalpha(ch[i]))str[j++]=ch[i];
else if(j)
{
str[j]=0;
for(j=0;str[j];j++)
if(isupper(str[j]))str[j]+=32;
for(p=head;p->next;p=p->next)
if(strcmp(str,p->next->word)==0)break;
if(p->next)p->next->count++;
else{
q=(linklist)malloc(sizeof(vnode));
//printf("%s\n",str);
strcpy(q->word,str);
q->count=1;
p->next=q;q->next=NULL;
}
j=0;if(!ch[i])break;
}
else if(!ch[i])break;
}
fclose(fp);
void boutput();
boutput();
}
void bdel()
{
linklist p=head,q;
while(p->next)
if(p->next->count<5)
{
q=p->next;p->next=q->next;

//free(q);
}
else p=p->next;
//printf("s%\n",p);
}
void bsort()
{
linklist p,q,r;
q=head->next->next;head->next->next=NULL;
while(q)
{
r=q;q=q->next;
for(p=head;p->next;p=p->next)
if(r->count>p->next->count)break;
r->next=p->next;p->next=r;
}
}
void boutput()
{
bsort();
linklist p=head->next;
FILE* fp=fopen("D:\\data\\File1.txt","w");
while(p)
{
printf(" %-15s\t%d\n",p->word,p->count);
//printf("%d",&basl);
fprintf(fp," %-15s\t%d\n",p->word,p->count);
p=p->next;
}
if(fp)printf("已成功寫入文件File1,路徑為D:\\data\\File1.txt,請自行查看\n");
fclose(fp);
}
void jm1()
{
time_t now=clock();
bread();
bdel();
boutput();
time_t f=clock();
FILE *fp=fopen("D:\\data\\File1.txt","a");
fprintf(fp,"時間為%.3fs\n",(double)(f-now)/CLOCKS_PER_SEC);
fclose(fp);
printf("時間為%.3fs\n",(double)(f-now)/CLOCKS_PER_SEC);
system("pause");
}
void jm2()
{
void basl();
int i;
while(true)
{
system("cls");
printf("統計低頻詞彙\n");
printf("1.統計單詞\n");
printf("2.刪除低頻單詞\n");
printf("3.輸出剩餘單詞及頻率\n");
printf("4.計算ASL\n");
printf("5.返回上一級\n");
printf("\n");
while(scanf("%d",&i),i<1&&i>5);
switch(i)
{
case 1:bread();system("pause");break;
case 2:bdel();system("pause");break;
case 3:boutput();system("pause"); break;
case 4:basl();system("pause");break;
case 5:return;
}
}
}
void bitree()
{
void sasl();
system("cls");
int i;
void bitree1();
void bitree2();
while(true)
{
system("cls");
printf("\n統計低頻詞彙\n");
printf("1.連續執行並顯示時間\n");
printf("2.分步執行\n");
printf("3.計算ASL\n");
printf("4.返回主菜單\n");
printf("\n");
while(scanf("%d",&i),i<1&&i>3);
switch(i)
{
case 1:bitree1();break;
case 2:bitree2();break;
case 3:sasl();break;
case 4:return;
}
}
}
void sread()
{
FILE* fp=fopen("D:\\data\\InFile.txt","r");
char ch[35],str[16];Bitree p,q;int i,j,flag=1;
while(~fscanf(fp,"%s",ch))
{
for(i=0,j=0;;i++)
if(isalpha(ch[i]))str[j++]=ch[i];
else if(j)
{
str[j]=0;
for(j=0;str[j];j++)
if(isupper(str[j]))str[j]+=32;
p=root;
if(flag)
{
strcpy(p->word,str);
p->count=1;p->lcchild=NULL;
p->rcchild=NULL;flag=0;
}
else while(true)
{
int k=strcmp(p->word,str);
if(k==0){p->count++;break;}
else if(k<0&&p->rcchild){
p=p->rcchild;continue;
}
else if(k<0){
q=(Bitree)malloc(sizeof(tree));
strcpy(q->word,str);
printf("%s ",str);
q->count=1;
p->rcchild=q;q->lcchild=NULL;
q->rcchild=NULL;
break;
}
else if(p->lcchild){
p=p->lcchild;continue;
}
else{
q=(Bitree)malloc(sizeof(tree));
strcpy(q->word,str);
printf("%s ",str);
q->count=1;
p->lcchild=q;q->lcchild=NULL;
q->rcchild=NULL;break;
}
}
j=0;if(!ch[i])break;
}
else if(!ch[i])break;
}
if(fp)printf("讀取文件成功\n");
fclose(fp);
inordertraverse(root,0);
}
void inserttree(Bitree p)
{
printf(" %-15s\t%d\n",p->word,p->count);
Bitree q=(Bitree)malloc(sizeof(tree));
strcpy(q->word,p->word);
q->count=p->count;
q->lcchild=NULL;
q->rcchild=NULL;
if(!root2){
root2=q;
return;
}Bitree r=root2;
while(true)
{
if(p->count<r->count&&r->rcchild){
r=r->rcchild;continue;
}
if(p->count<r->count){
r->rcchild=q;
break;
}
if(p->count>=r->count&&r->lcchild){
r=r->lcchild;continue;
}
r->lcchild=q;
break;
}
}
void bitree(Bitree r)
{
if(r){
if(r->count>4)inserttree(r);
if(r->lcchild)bitree(r->lcchild);
if(r->rcchild)bitree(r->rcchild);

}
}
void del()
{
bitree(root);
root=root2;
}
void output()
{
FILE* fp=fopen("D:\\data\\File2.txt","w");
//printf("%s\n",root2);
//printf("已刪除\n");
fprintf(fp,"%s\n",root2,fp);
inordertraverse(root2,fp);
//while(r)
// {
// printf(" %-15s\t%d\n",r->word,r->count);
// fprintf(fp," %-15s\t%d\n",r->word,r->count);
// r=r->next;
// }
if(fp)printf("已成功寫入文件File2,路徑為D:\\data\\File2.txt,請自行查看\n");
fclose(fp);
}
void bitree1()
{
time_t now=clock();
sread();
del();
output();
void sasl();
sasl();
time_t f=clock();
FILE *fp=fopen("D:\\data\\File2.txt","a");
fprintf(fp,"時間為%.3fs\n",(double)(f-now)/CLOCKS_PER_SEC);
fclose(fp);
printf("時間為%.3fs\n",(double)(f-now)/CLOCKS_PER_SEC);
system("pause");
}
void bitree2()
{
int i;void sasl();
while(true)
{
system("cls");
printf("低頻詞過濾\n");
printf("1.統計單詞\n");
printf("2.刪除低頻單詞\n");
printf("3.輸出剩餘單詞及頻率\n");
printf("4.計算ASL\n");
printf("5.返回上一級\n");
printf("\n");
while(scanf("%d",&i),i<1&&i>5);
switch(i)
{
case 1:sread();system("pause");break;
case 2:del();system("pause");break;
case 3:output();system("pause"); break;
case 4:sasl();break;
case 5:return;
}
}
}
void basl()
{
linklist p=head;
float asl;
int wn=0;
while(p->next)
{
wn++;
p=p->next;
}
asl=((float)wn+1)/2.0;
printf("ASL值為:%.3f\n",asl);
//fprintf("ASL值為:%.3f\n",asl)
system("pause");
}
void shu(Bitree p,int qu,int &wn,float &sl)
{
if(p){
wn++;sl+=qu;
shu(p->lcchild,qu+1,wn,sl);
shu(p->rcchild,qu+1,wn,sl);
}
}
void sasl()
{
int qu=1,wn=0;float asl=0;
shu(root,qu,wn,asl);
printf("ASL值為:%.3f\n",asl/wn);
system("pause");}

F. 濾波在數學上是如何實現的

在單片機進行數據採集時,會遇到數據的隨機誤差,隨機誤差是由隨機干擾引起的,其特點是在相同條件下測量同一量時,其大小和符號會現無規則的變化而無法預測,但多次測量的結果符合統計規律。為克服隨機干擾引起的誤差,硬體上可採用濾波技術,軟體上可採用軟體演算法實現數字濾波。濾波演算法往往是系統測控演算法的一個重要組成部分,實時性很強。

採用數字濾波演算法克服隨機干擾的誤差具有以下優點:

1、數字濾波無需其他的硬體成本,只用一個計算過程,可靠性高,不存在阻抗匹配問題。尤其是數字濾波可以對頻率很低的信號進行濾波,這是模擬濾波器做不到的。
2、數字濾波使用軟體演算法實現,多輸入通道可共用一個濾波程序,降低系統開支。
3、只要適當改變濾波器的濾波程序或運算,就能方便地改變其濾波特性,這對於濾除低頻干擾和隨機信號會有較大的效果。
4、在單片機系統中常用的濾波演算法有限幅濾波法、中值濾波法、算術平均濾波法、加權平均濾波法、滑動平均濾波等。

(1)限幅濾波演算法

該運算的過程中將兩次相鄰的采樣相減,求出其增量,然後將增量的絕對值,與兩次采樣允許的最大差值A進行比較。A的大小由被測對象的具體情況而定,如果小於或等於允許的最大差值,則本次采樣有效;否則取上次采樣值作為本次數據的樣本。

演算法的程序代碼如下:

#defineA //允許的最大差值
chardata; //上一次的數據
char filter()
{
chardatanew; //新數據變數
datanew=get_data(); //獲得新數據變數
if((datanew-data)>A||(data-datanew>A))
return data;
else
returndatanew;
}

說明:限幅濾波法主要用於處理變化較為緩慢的數據,如溫度、物體的位置等。使用時,關鍵要選取合適的門限制A。通常這可由經驗數據獲得,必要時可通過實驗得到。

(2)中值濾波演算法

該運算的過程是對某一參數連續采樣N次(N一般為奇數),然後把N次采樣的值按從小到大排列,再取中間值作為本次采樣值,整個過程實際上是一個序列排序的過程。

演算法的程序代碼如下:
#define N11 //定義獲得的數據個數
char filter()
{
charvalue_buff[N]; //定義存儲數據的數組
char count,i,j,temp;
for(count=0;count
{
value_buf[count]=get_data();
delay(); //如果採集數據比較慢,那麼就需要延時或中斷
}
for(j=0;j
{
for(value_buff[i]>value_buff[i+1]
{
temp=value_buff[i];
value_buff[i]=value_buff[i+1];
value_buff[i+1]=temp;
}
}
returnvalue_buff[(N-1)/2];
}

說明:中值濾波比較適用於去掉由偶然因素引起的波動和采樣器不穩定而引起的脈動干擾。若被測量值變化比較慢,採用中值濾波法效果會比較好,但如果數據變化比較快,則不宜採用此方法。

(3)算術平均濾波演算法

該演算法的基本原理很簡單,就是連續取N次采樣值後進行算術平均。
演算法的程序代碼如下:
char filter()
{
int sum=0;
for(count=0;count
{
sum+=get_data();
delay():
}
return (char)(sum/N);
}

說明:算術平均濾波演算法適用於對具有隨機干擾的信號進行濾波。這種信號的特點是有一個平均值,信號在某一數值附近上下波動。信號的平均平滑程度完全到決於N值。當N較大時,平滑度高,靈敏度低;當N較小時,平滑度低,但靈敏度高。為了方便求平均值,N一般取4、8、16、32之類的2的整數冪,以便在程序中用移位操作來代替除法。

(4)加權平均濾波演算法

由於前面所說的「算術平均濾波演算法」存在平滑度和靈敏度之間的矛盾。為了協調平滑度和靈敏度之間的關系,可採用加權平均濾波。它的原理是對連續N次采樣值分別乘上不同的加權系數之後再求累加,加權系數一般先小後大,以突出後面若干采樣的效果,加強系統對參數變化趨勢的認識。各個加權系數均小於1的小數,且滿足總和等於1的結束條件。這樣加權運算之後的累加和即為有效采樣值。其中加權平均數字濾波的數學模型是:

式中:D為N個采樣值的加權平均值:XN-i為第N-i次采樣值;N為采樣次數;Ci為加權系數。加權系數Ci體現了各種采樣值在平均值中所佔的比例。一般來說采樣次數越靠後,取的比例越大,這樣可增加新采樣在平均值中所佔的比重。加權平均值濾波法可突出一部分信號抵制另一部分信號,以提高采樣值變化的靈敏度。

樣常式序代碼如下:

char codejq[N]={1,2,3,4,5,6,7,8,9,10,11,12}; //code數組為加權系數表,存在程序存儲區
char codesum_jq=1+2+3+4+5+6+7+8+9+10+11+12;
char filter()
{
char count;
char value_buff[N];
int sum=0;
for(count=0;count
{
value_buff[count]=get_data();
delay();
}
for(count=0;count
sum+=value_buff[count]*jq[count];
return(char)(sum/sum_jq);
}

(5)滑動平均濾波演算法

以上介紹和各種平均濾波演算法有一個共同點,即每獲取一個有效采樣值必須連續進行若干次采樣,當采速度慢時,系統的實時得不到保證。這里介紹的滑動平均濾波演算法只採樣一次,將一次采樣值和過去的若干次采樣值一起求平均,得到的有效采樣值即可投入使用。如果取N個采樣值求平均,存儲區中必須開辟N個數據的暫存區。每新採集一個數據便存入暫存區中,同時去掉一個最老數據,保存這N個數據始終是最新更新的數據。採用環型隊列結構可以方便地實現這種數據存放方式。

程序代碼如下:
char value_buff[N];
char i=0;
char filter()
{
char count;
int sum=0;
value_buff[i++]=get_data();
if(i==N)
i=0;
for(count=0;count
sum=value_buff[count];
return (char)(sum/N);
}

(6)低通濾波

將普通硬體RC低通濾波器的微分方程用差分方程來表求,變可以採用軟體演算法來模擬硬體濾波的功能,經推導,低通濾波演算法如下:

Yn=a* Xn+(1-a) *Yn-1
式中 Xn——本次采樣值
Yn-1——上次的濾波輸出值;
,a——濾波系數,其值通常遠小於1;
Yn——本次濾波的輸出值。

由上式可以看出,本次濾波的輸出值主要取決於上次濾波的輸出值(注意不是上次的采樣值,這和加權平均濾波是有本質區別的),本次采樣值對濾波輸出的貢獻是比較小的,但多少有些修正作用,這種演算法便模擬了具體有教大慣性的低通濾波器功能。濾波演算法的截止頻率可用以下式計算:

fL=a/2Pit pi為圓周率3.14…
式中 a——濾波系數;
, t——采樣間隔時間;
例如:當t=0.5s(即每秒2次),a=1/32時;
fL=(1/32)/(2*3.14*0.5)=0.01Hz

當目標參數為變化很慢的物理量時,這是很有效的。另外一方面,它不能濾除高於1/2采樣頻率的干攪信號,本例中采樣頻率為2Hz,故對1Hz以上的干攪信號應採用其他方式濾除,

低通濾波演算法程序於加權平均濾波相似,但加權系數只有兩個:a和1-a。為計算方便,a取一整數,1-a用256-a,來代替,計算結果捨去最低位元組即可,因為只有兩項,a和1-a,均以立即數的形式編入程序中,不另外設表格。雖然采樣值為單元位元組(8位A/D)。為保證運算精度,濾波輸出值用雙位元組表示,其中一個位元組整數,一位元組小數,否則有可能因為每次捨去尾數而使輸出不會變化。
設Yn-1存放在30H(整數)和31H(小數)兩單元中,Yn存放在32H(整數)和33H(小數)中。濾波程序如下:
雖千萬里,吾往矣。

G. 如何濾除低頻尖峰脈沖

肯定要濾波,濾除低頻尖峰是高頻信號通過就要使用高通濾波器。

高通濾波器,又稱低截止濾波器、低阻濾波器,允許高於某一截頻的頻率通過,而大大衰減較低頻率的一種濾波器。它去掉了信號中不必要的低頻成分或者說去掉了低頻干擾。下面是一種最簡單的高通濾波器,可以滿足你的要求。

圖 高通濾波器

熱點內容
md5加密後的密碼是什麼意思 發布:2025-01-18 15:50:16 瀏覽:192
如何qq空間訪問許可權 發布:2025-01-18 15:49:30 瀏覽:531
matlab遺傳演算法約束 發布:2025-01-18 15:31:33 瀏覽:909
果凍java 發布:2025-01-18 15:25:59 瀏覽:695
電腦與時間伺服器同步間隔 發布:2025-01-18 15:21:28 瀏覽:54
蘋果手機apple登錄密碼在手機哪裡 發布:2025-01-18 15:13:43 瀏覽:380
吃雞去哪裡下手游安卓 發布:2025-01-18 15:10:59 瀏覽:668
東方財富dk指標源碼 發布:2025-01-18 14:45:53 瀏覽:435
陌陌登陸密碼是什麼 發布:2025-01-18 14:36:54 瀏覽:848
海龜編譯器代碼 發布:2025-01-18 14:16:51 瀏覽:34