怎样用c语言来实现基于lms算法的fsk调制解调系统

怎样用c语言来实现基于lms算法的fsk调制解调系统,第1张

1.最简单的方法:

public static String reverse1(String str)

{

   return new StringBuffer(str).reverse().toString()

}

2.最常用的方法:

public static String reverse3(String s)

 { 

   char[] array = s.toCharArray() 

  String reverse = ""  //注意这是空串,不是null

   for (int i = array.length 余羡顷- 1 i >= 0 i--) 

   reverse += array[i] 

   return reverse 

  } 

3.常用方法的变形:

 public static String reverse2(String s)

  int length = s.length() 

   String reverse = ""  //注意这是空串,不是null

   for (int i = 0 i < length i++) 

    reverse = s.charAt(i) + reverse//在字符串前面连接,  而非常见的后面

   return reverse 

  } 

4.C语言中常用的方法:

 public static String reverse5(String orig)

{ 派氏

  char[] s = orig.toCharArray() 

  int n = s.length - 1 

  int halfLength = n / 2 

  for (int i = 0 i <= halfLength i++) { 

    char temp = s[i] 

   s[i] = s[n - i] 

   s[n - i] = temp 

   } 

   return new String(s)  //知竖陆道  char数组和String相互转化

  }

自适应过程一般采用典型LMS自适应算法,但当滤波器的输入信号没察为有色随机过程时,特别是当输入信号为高度相关时,这种算法收敛速度要下降许多,这主要是因为输入信号的自相关矩阵特征值的分散程度加剧将导致算法收敛性能的恶化和稳态误差的增大。此时若采用变换域算法可以增加算法收敛速度。变换域算法的基本思想是:先对输入信号进行一次正交变换以去除或衰减其相关性,然后将变换茄姿后的信号加到自适应滤波器以实现滤波处理,从而改善相关矩阵的条件数。因为离散傅立叶变换�DFT 本身具有近似正交性,加之有FFT快速算法,故频域分块LMS�FBLMS 算法被广泛应用。

FBLMS算法本质上是以频域来实现时域分块LMS算法的,即将时域数据分组构成N个点的数据块,且在每块上滤波颤察绝权系数保持不变。其原理框图如图2所示。FBLMS算法在频域内可以用数字信号处理中的重叠保留法来实现,其计算量比时域法大为减少,也可以用重叠相加法来计算,但这种算法比重叠保留法需要较大的计算量。块数据的任何重叠比例都是可行的,但以50%的重叠计算效率为最高。对FBLMS算法和典型LMS算法的运算量做了比较,并从理论上讨论了两个算法中乘法部分的运算量。本文从实际工程出发,详细分析了两个算法中乘法和加法的总运算量,其结果为:

复杂度之比=FBLMS实数乘加次数/LMS实数乘加次数=(25Nlog2N+2N-4)/[2N(2N-1)]�

采用ADSP的C语言来实现FBLMS算法的程序如下:

for(i=0i<=30i++)

{for(j=0j<=n-1j++)

{in[j]=input[i×N+j]

rfft(in,tin,nf,wfft,wst,n)

rfft(w,tw,wf,wfft,wst,n)

cvecvmlt(inf,wf,inw,n)

ifft(inw,t,O,wfft,wst,n)

for(j=0,j<=N-1j++)

{y[i×N+j]=O[N+j].re

e[i×N+j]=refere[i×N+j]-y[i×N+j]

temp[N+j]=e[i×N+j}

rfft(temp,t,E,wfft,wst,n)

for(j=0j<=n-1j++)

{inf_conj[j]=conjf(inf[j])} ��

cvecvmlt(E,inf_conj,Ein,n)

ifft(Ein,t,Ein,wfft,wst,n)

for(j=0j<=N-1j++)

{OO[j]=Ein[j].re

w[j]=w[j]+2*u*OO[j]}��

}

在EZ-KIT测试板中,笔者用汇编语言和C语言程序分别测试了典型LMS算法的运行速度,并与FBLMS算法的C语言运行速度进行了比较,表2所列是其比较结果,从表2可以看出滤波器阶数为64时,即使是用C语言编写的FBLMS算法也比用汇编编写的LMS算法速度快20%以上,如果滤波器的阶数更大,则速度会提高更多。

>> clear all;

g=100

N=256

k=16

pp=zeros(g,N-k)

u=0.01

for q=1:g,

t=1:N

a=1

s=a*sin(0.05*pi*t)

figure(1)

subplot(3,1,1)

plot(t,real(s))

title('信号s时域波形')

xlabel('n')

ylabel('s')

axis([0,N,-a-1,a+1])

xn=awgn(s,5)

y=zeros(1,N)

y(1:k)=xn(1:k)

w=zeros(1,k)

e=zeros(1,N)

for i=(k+1):N,

XN=xn((i-k+1):i)

y(i)=w*XN'

e(i)=s(i)-y(i)

w=w+u*e(i)*XN

end

pp(q,:)=(e((k+1):N)).^2

end

subplot(3,1,2)

plot(t,real(xn))

title('信号s加噪声后的时握档域波形')

subplot(3,1,3)

plot(t,real(y))

title('自适应滤波后的输出时空皮键斗巧时域波形')

for c=1:N-k

bi(c)=sum(pp(:,c))/g

end

figure(2)

T=1:N-k

plot(T,bi,'b')

hold on


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12309667.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存