当前位置:首页 » 操作系统 » 过滤低频算法

过滤低频算法

发布时间: 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. 如何滤除低频尖峰脉冲

肯定要滤波,滤除低频尖峰是高频信号通过就要使用高通滤波器。

高通滤波器,又称低截止滤波器、低阻滤波器,允许高于某一截频的频率通过,而大大衰减较低频率的一种滤波器。它去掉了信号中不必要的低频成分或者说去掉了低频干扰。下面是一种最简单的高通滤波器,可以满足你的要求。

图 高通滤波器

热点内容
文件夹怎么打开 发布:2025-01-18 18:47:07 浏览:296
杉德卡卡号和密码看哪里 发布:2025-01-18 18:43:27 浏览:712
android返回退出 发布:2025-01-18 18:43:26 浏览:601
linux采集视频 发布:2025-01-18 18:38:38 浏览:638
差异度算法 发布:2025-01-18 18:34:27 浏览:698
电脑全套配置有哪些 发布:2025-01-18 18:32:39 浏览:145
新项目源码 发布:2025-01-18 18:14:48 浏览:517
脚本设计图 发布:2025-01-18 18:06:17 浏览:601
内部存储空间不足总是跳出来 发布:2025-01-18 17:56:22 浏览:951
安卓光遇更新后魔法商店去哪里了 发布:2025-01-18 17:55:47 浏览:133