生:北京交通大学
数字信号处理(DSP) 综合设计性实验报告
题目:任意信号发生器的设计
学 院: 电 子 信 息 工 程 学 院
班 级: 指导教师: 钱满义
北京交通大学电工电子教学基地
2013年7月15日 目 录
学
DSP课程设计实验报告
一、设计任务 …………………………………………………
二、实验目的 …………………………………………………
三、实验要求及目标…………………………………………………
四、实验原理…………………………………………………
五、程序代码及仿真结果…………………………………………………
1. 泰勒级数产生正弦波 2. 泰勒级数产生余弦波 3. 三角波 4. 方波 5. 锯齿波
六、实验总结…………………………………………
七、参考资料…………………………………………
DSP课程设计实验报告
一. 设计任务
信号发生器又称信号源或振荡器,在生产实践和科技领域中有着广泛的应用。各种波形曲线均可以用三角函数方程式来表示。能够产生多种波形,如三角波、锯齿波、矩形波(含方波)、正弦波的电路被称为函数信号发生器。函数信号发生器在电路实验和设备检测中具有十分广泛的用途。信号发生器在现代工程中应用非常广泛。在实际中常需要产生一些特殊波形,用于仿真实际信号的波形,以检测和调试测量装置。
使用 DSP可以产生连续的正弦波信号,同样也能产生方波、锯齿波、三角波等其它各种信号波形。本设计要求采用DSP及其CODEC产生上述各种信号波形。
二. 实验目的
(1)了解产生信号的两种方法及各自的优缺点。
(2)掌握使用DSP产生正弦波的原理和算法,进而掌握一般信号产生的原理和方法。
(3)掌握5502DSK CODECC的工作原理和初始化过程。
三. 设计要求及目标
基本部分:
使用DSP产生300—4000HZ的正弦信号,要求使用计算法,并且频率可变、幅度可变、直流分量可变。
DSP课程设计实验报告
发挥部分:
使用DSP产生300—4000HZ的方波、锯齿波和三角波。
四. 设计思路
产生连续信号的方法通常有两种:查表法和计算法,查表法不如计算法使用灵活。计算法可以使用泰勒级数展开法进行计算,也可以使用差分方程进行迭代计算或者直接使用三角函数进行计算。计算结果可以边计算边输出,也可以先计算后输出。
正弦函数和余弦函数的泰勒级数数学表达式为:
x3x5x7x9x2n1n1x(1)3!5!7!9!(2n1)!sinx,x(,)
2nx2x4x6x8nx1(1)2!4!6!8!(2n)!cosx,x(,).
如果要计算一个角度ⅹ的正弦和余弦值,可以取其前五项进行近似计算。或使用下面递归的差分方程进行计算。
y[n]=A*y[n-1]-y[n-2] 其中:A=2cos(x),x=2πF/FS。F—信号频率,
FS—D/A转换频率。
利用递推公式计算正弦和余弦值需要已知cos(x)和正弦、余弦的前两个值。计算时所需的计算量小,但如果用来产生连续的正弦和余弦信号,则累积误差太大。要得到精确的计算结果,可以使用泰勒级数展开法进行计算,当然计算时所需的计算量很大。在实际应用时可以根据需要选择相应的算法。
要产生一个正弦信号,首先要算出一个周期内各样点的值,因为sin(x)的值总是小于1的小数,而02 DSP是16位的定点处理器,所以要将其乘以
DSP课程设计实验报告
2,变为Q15的数据格式,才能够在DSP中送到D/A转换器进行处理。 查表法与计算法的优缺点比较:
查表法:事先将要输出的数据计算好,存储在DSP的内部RAM中,然后依次循环输出,从而才生波形。这种方法的优点在于其速度快,可以产生频率很高的波形,而且不占用DSP的计算时间,它的缺点是需要占用DSP的内存空间,尤其是对采样频率比较大的输出波形,所需要的内部空间很大,所以这种方法用于对精度和频率要求不高的场合。
计算法:采用计算的方法依次计算数据然后输出。计算法的优缺点正好和查表法相反。其优点是不占用DSP的存储空间,可以根据信息随时间改变或调整输出波形的周期波形;其缺点是占用DSP的计算时间,使得执行程序的开销大
在本次实验中我们采用计算法来产生正弦波,并且同时使用了泰勒级数、递归差分方程和三角函数计算三种方法来进行计算,以对这三种算法进行横向比较。
15
五. 程序代码及仿真结果
1.泰勒级数法实现正弦波 程序代码:
#include #include #include DSP课程设计实验报告 #include #include //#include \"E2PROM_Function.h\" #include \"CODEC.h\" #define Nx 720 //每周期抽取点数 #pragma DATA_SECTION(output1,\"data_out1\"); //存放sin数据,浮点型 float output1[Nx]; #pragma DATA_SECTION(output,\"data_out\"); //存放sin数据,定点型 int output[Nx]; #define pi 3.1415927 #define pi2 2*pi #define F0 1000 //Signal frequency #define Fs 16000 //Sampling frequency// #undef CODEC_ADDR #define CODEC_ADDR 0x1A #define _COSX 0.999390827 /* Global declarations */ //int inp_buffer[BUFSIZE]; /* processing data buffers */ //int out_buffer[BUFSIZE]; int gain = MINGAIN; /* volume control variable */ int frequency = MINGAIN; int abc = MINGAIN; unsigned int processingLoad = BASELOAD; /* processing routine load value */ /*****************余弦函数*****************/ int o=2; int dacdata[Nx]; float _cosx[Nx]; /*****************方波函数*********/ double squ[Nx]; int dacdata2[Nx]; int outbuffer[Nx]; int amp=100; unsigned int t=0; /*****************锯齿波*****************/ double z=0; double dt; unsigned int p=0; double saw[Nx]; int dacdata4[Nx],outbuffer3[Nx]; /*****************三角波函数*****************/ DSP课程设计实验报告 double tri[Nx]; int dacdata3[Nx],outbuffer2[Nx]; int amp2=2; double T=0, DT; unsigned int I=0; // 定义McBSP的句柄 MCBSP_Handle hMcbsp; /*------------------------------------------------------------------------------------*/ // // FUNCTION: MAIN // /*------------------------------------------------------------------------------------*/ void main(void) { Uint16 i=0,k=0; float input0=0,x1; float a,b,c,d,e,f,g,h,ii,step;//step为角度步长 step=360.0/Nx; // Nx为360度内取样点数 /*****************正弦函数*****************/ for(i=0;i<=Nx-1;i++) { float angle,xx; angle=input0+step*i; x1=3.1415926*angle/180; //将角度转为弧度 xx=x1*x1; a=1-xx/16/17;b=1-xx/14/15*a;c=1-xx/12/13*b;d=1-xx/10/11*c;e=1-xx/8/9*d;f=1-xx/6/7*e;g=1-xx/4/5*f;h=1-xx/2/3*g;ii=x1*h; //ii=x1*(1-xx/2/3*(1-xx/4/5*(1-xx/6/7*(1-xx/8/9*(1-xx/10/11*(1-xx/12/13*(1-xx/14/15*(1-xx/16/17))))))));//数学总公式 // fprintf(stdout,\"COMPUTE%f\fprintf(stdout,\"\\n \"); //输出计算的正弦波的数值,x2=e output1[i]= 32767*ii; //利用泰勒级数计算出正弦波的数值,存放到output1中 output[i]=output1[i]/32; // Initialize CSL library - This is REQUIRED !!! CSL_init(); DSP课程设计实验报告 // The main frequency of system is 240MHz // 该频率是为了设置IIC模块的需要设置的,为了使用I2C_setup函数 PLL_setFreq(1, 0xC, 0, 1, 3, 3, 0); //EMIF初始化 Emif_Config(); // Open McBSP port 1 and get a McBSP type handle hMcbsp = MCBSP_open(MCBSP_PORT1,MCBSP_OPEN_RESET); // Config McBSP port 1 by use previously defined structure Mcbsp_Config(hMcbsp); //I2C初始化 I2C_cofig(); //CODEC寄存器初始化 inti_AIC(); /*------------------------------------------------------------------------------------*/ // Receive the ADC output data of CODEC // Then output the received data to DAC of CODEC /*------------------------------------------------------------------------------------*/ while(1) { while(!MCBSP_xrdy(hMcbsp)) {}; MCBSP_write16(hMcbsp, dacdata4[k]*gain+abc); //左声道输出 while(!MCBSP_xrdy(hMcbsp)) {}; MCBSP_write16(hMcbsp, dacdata4[k]*gain+abc); //右声道输出 k=k+1+frequency; //正弦波每周期的样点为360个,输出信号的频率为Fs/N=32000/360=88.Hz // k=k+10; //正弦波每周期的样点为36个,输出信号的频率为Fs/N=32000/36=888.9Hz if (k>=Nx) k=k%Nx; } } } GEL文件: DSP课程设计实验报告 Amp.gel: menuitem \"Signal Gain\" slider gain(0,1000,1,1,gainparameter) { Amp=gainparameter; } Fre.gel: menuitem \"Signal Frequency\" slider fre(40,1000,1,1,freparameter) { Fre=freparameter; } 硬件仿真结果: DSP课程设计实验报告 添加GEL程序进行变量的滑块控制 DSP课程设计实验报告 此时设定输出幅度为572V,示波器测得电压为570V,输出频率为129Hz。 DSP课程设计实验报告 经测试仪测试为516Hz,基本正确。 设计程序输出频率范围为40—1000Hz。 设计程序输出幅度范围为0-1000V。 2.泰勒级数法实现余弦波 程序代码: #include #include #include #include //#include \"E2PROM_Function.h\" #include \"CODEC.h\" #define K 0 //直流分量 #pragma DATA_SECTION(output1,\"data_out1\"); //存放cos数据,浮点型 float output1[1000]; #pragma DATA_SECTION(output,\"data_out\"); //存放cos数据,定点型 int output[1000]; volatile int Fre; //余弦波每周期的样点为Nx个,输出信号的频率为Fs/Nx=32000/Nx volatile int gain; //余弦波幅度范围定义为0-1000V #undef CODEC_ADDR #define CODEC_ADDR 0x1A // 定义McBSP的句柄 MCBSP_Handle hMcbsp; /*------------------------------------------------------------------------------------*/ // // FUNCTION: MAIN // DSP课程设计实验报告 /*------------------------------------------------------------------------------------*/ void main(void) { Uint16 i=0,k=0; int Nx=(int)32000/Fre; //将输入的频率值转变为Nx值 int amp=(int)gain/3.14; float input0=0,x1,x2; float a,b,c,d,e,f,g,h,ii,step; //step为角度步长 step=360.0/Nx; // Nx为360度内取样点数 /*****************余弦函数*****************/ _cosx[0]=1.000; dacdata[0]=200; _cosx[1]=_COSX; dacdata[1]=_COSX*100+100; while(1) { if(o++>Nx-1) break; _cosx[o]=2*_COSX*_cosx[o-1]-_cosx[o-2]; dacdata[o]=_cosx[o]*100+100; } } // Initialize CSL library - This is REQUIRED !!! CSL_init(); // The main frequency of system is 240MHz // 该频率是为了设置IIC模块的需要设置的,为了使用I2C_setup函数 PLL_setFreq(1, 0xC, 0, 1, 3, 3, 0); //EMIF初始化 Emif_Config(); // Open McBSP port 1 and get a McBSP type handle hMcbsp = MCBSP_open(MCBSP_PORT1,MCBSP_OPEN_RESET); // Config McBSP port 1 by use previously defined structure Mcbsp_Config(hMcbsp); DSP课程设计实验报告 //I2C初始化 I2C_cofig(); //CODEC寄存器初始化 inti_AIC(); while(1) { while(!MCBSP_xrdy(hMcbsp)) {}; MCBSP_write16(hMcbsp, dacdata[k]*gain+abc); while(!MCBSP_xrdy(hMcbsp)) {}; MCBSP_write16(hMcbsp, dacdata[k]*gain+abc); k=k+1+frequency; if (k>=Nx) k=k%Nx; } } GEL文件: ampcos.gel: menuitem \"Signal Gain\" slider gain4(0,1000,1,1,gainparameter) { gain=gainparameter; } Frecos.gel: menuitem \"Signal Frequency\" slider fre4(40,1000,1,1,freparameter) { Fre=freparameter; } 硬件仿真结果: //左声道输出 //右声道输出 DSP课程设计实验报告 添加GEL程序进行变量的滑块控制 DSP课程设计实验报告 此时设定输出幅度为355V,示波器测得电压为355V,输出频率为458Hz。经测试仪测试为473Hz,基本正确。 设计程序输出频率范围为40—1000Hz。 设计程序输出幅度范围为0-1000V。 3.三角波 程序代码: #include #include #include #include DSP课程设计实验报告 #include \"CODEC.h\" #define pi 3.1415927 #define pi2 2*pi #undef CODEC_ADDR #define CODEC_ADDR 0x1A volatile int Fre; //三角波每周期的样点为Nx个,输出信号的频率为Fs/Nx=32000*2/Nx volatile int Amp; //三角波幅度范围定义为0-1000V double tri[2000]; //存放三角波数据 int outbuffer[2000]; //存放输出数据 double T=0, DT; //中间控制变量 unsigned int I=0; // 定义McBSP的句柄 MCBSP_Handle hMcbsp; /*------------------------------------------------------------------------------------*/ // // FUNCTION: MAIN // /*------------------------------------------------------------------------------------*/ void main(void) { Uint16 i=0,k=0; int Nx=(int)(000/Fre); //将输入的频率值转变为Nx值 int amp3=(int)(Amp/8.09); /*****************三角波函数*****************/ DT=8*pi*F0/Fs; for(T=0,I=0;I<=Nx/4;I++,T+=DT) {tri[Nx/2-I]=tri[I]=T; } for(T=0,I=Nx/2;I<=3*Nx/4;I++,T+=DT) { tri[I]=T; tri[Nx-I+Nx/2]=tri[I]; } for(I=0;I<=Nx;I++) { dacdata3[I]=tri[I]*10; outbuffer2[I]=amp2*dacdata3[I]; DSP课程设计实验报告 } // Initialize CSL library - This is REQUIRED !!! CSL_init(); // The main frequency of system is 240MHz PLL_setFreq(1, 0xC, 0, 1, 3, 3, 0); //EMIF初始化 Emif_Config(); // Open McBSP port 1 and get a McBSP type handle hMcbsp = MCBSP_open(MCBSP_PORT1,MCBSP_OPEN_RESET); // Config McBSP port 1 by use previously defined structure Mcbsp_Config(hMcbsp); //I2C初始化 I2C_cofig(); //CODEC寄存器初始化 inti_AIC(); while(1) { while(!MCBSP_xrdy(hMcbsp)) {}; MCBSP_write16(hMcbsp, outbuffer2[k]); //左声道输出 while(!MCBSP_xrdy(hMcbsp)) {}; MCBSP_write16(hMcbsp, outbuffer2[k]); //右声道输出 k=k+1+frequency; if (k>=Nx) k=k%Nx; } } GEL文件: amptri.gel: menuitem \"Signal Gain\" slider amp3(0,1000,1,1,gainparameter) { Amp=gainparameter; } Fretri.gel: DSP课程设计实验报告 menuitem \"Signal Frequency\" slider fre4(40,1000,1,1,freparameter) { Fre=freparameter; } 硬件仿真结果: DSP课程设计实验报告 添加GEL程序进行变量的滑块控制: DSP课程设计实验报告 此时设定输出幅度为5V,示波器测得电压为582V,输出频率为334Hz。经测试仪测试为344Hz,基本正确。 设计程序输出频率范围为40—1000Hz。 设计程序输出幅度范围为0-1000V。 4.矩形波 程序代码: #include #include #include DSP课程设计实验报告 #include #include #define CODEC_ADDR 0x1A double squ[2000]; //存放矩形波数据 int dacdata[2000]; int outbuffer[2000]; //输出缓存 unsigned int t=0; volatile int Fre; //方波每周期的样点为Nx个,Fs*2/Nx=32000*2/Nx volatile int Amp; //方波幅度范围定义为0-1000V // 定义McBSP的句柄 MCBSP_Handle hMcbsp; void main(void) { Uint16 i=0,k=0; int Nx=(int)(000/Fre); //将输入的频率值转变为Nx值 int amp2=(int)(Amp/2.227); /*****************方波函数*********/ for(t=0;t<=Nx/4;t++) { squ[t]=1; squ[t+Nx/4]=-1; squ[t+Nx/2]=1; squ[Nx-t]=-1; } for(t=0;t outbuffer[t]=amp*dacdata2[t]; } // CSL初始化 CSL_init(); // The main frequency of system is 240MHz 输出信号的频率为DSP课程设计实验报告 PLL_setFreq(1, 0xC, 0, 1, 3, 3, 0); //EMIF初始化 Emif_Config(); // 打开 McBSP 1 接口 hMcbsp = MCBSP_open(MCBSP_PORT1,MCBSP_OPEN_RESET); // 定义McBSP接口 1 Mcbsp_Config(hMcbsp); //I2C初始化 I2C_cofig(); //CODEC寄存器初始化 inti_AIC(); while(1) { while(!MCBSP_xrdy(hMcbsp)) {}; MCBSP_write16(hMcbsp, dacdata2[k]); while(!MCBSP_xrdy(hMcbsp)) {}; MCBSP_write16(hMcbsp, dacdata2[k]); k=k+1; if (k>=Nx) k=k%Nx; } } GEL文件: Ampsqr.gel: menuitem \"Signal Gain\" slider amp2(0,1000,1,1,gainparameter) { Amp=gainparameter; } Fresqr.gel: menuitem \"Signal Frequency\" slider fre4(40,1000,1,1,freparameter) { Fre=freparameter; //左声道输出 //右声道输出 DSP课程设计实验报告 } 硬件仿真结果: DSP课程设计实验报告 添加GEL程序进行变量的滑块控制: DSP课程设计实验报告 DSP课程设计实验报告 此时设定输出幅度为492V,示波器测得电压为490V,输出频率为311Hz。经测试仪测试为322Hz,基本正确。 设计程序输出频率范围为40—1000Hz。 设计程序输出幅度范围为0-1000V。 5.锯齿波 程序代码: #include #include #include DSP课程设计实验报告 #include #include #include \"CODEC.h\" #define pi 3.1415927 #define pi2 2*pi #undef CODEC_ADDR #define CODEC_ADDR 0x1A double z=0; //中间控制变量 double dt; unsigned int p=0; double saw[2000]; //存放锯齿波数据 int outbuffer[2000]; //输出缓存 volatile int Fre; //锯齿波每周期的样点为Nx个,Fs*4/Nx=32000*4/Nx volatile int Amp; //锯齿波幅度范围定义为0-1000V // 定义McBSP的句柄 MCBSP_Handle hMcbsp; void main(void) { Uint16 i=0,k=0; int pp=(int)(Fre/4); int Nx=(int)(32000/pp); //将输入的频率值转变为Nx值 int amp1=(int)(Amp/8.04); /*****************锯齿波*****************/ dt=8*pi*F0/Fs; for(z=0,p=0;p<=Nx/4;p++,z+=dt) { saw[p]=z; saw[p+Nx/4]=saw[p]; } for(z=0,p=Nx/2;p<=3*Nx/4;p++,z+=dt) { saw[p]=z; saw[p+Nx/4]=saw[p]; } 输出信号的频率为DSP课程设计实验报告 for(p=0;p // CSL初始化 CSL_init(); // The main frequency of system is 240MHz PLL_setFreq(1, 0xC, 0, 1, 3, 3, 0); //EMIF初始化 Emif_Config(); // 打开 McBSP 1 接口 hMcbsp = MCBSP_open(MCBSP_PORT1,MCBSP_OPEN_RESET); // 配置 McBSP 1 接口 Mcbsp_Config(hMcbsp); //I2C初始化 I2C_cofig(); //CODEC寄存器初始化 inti_AIC(); while(1) { while(!MCBSP_xrdy(hMcbsp)) {}; MCBSP_write16(hMcbsp, dacdata[k]); //左声道输出 while(!MCBSP_xrdy(hMcbsp)) {}; MCBSP_write16(hMcbsp, dacdata[k]); //右声道输出 k=k+1; if (k>=Nx) k=k%Nx; } } GEL文件: Ampsaw.gel: menuitem \"Signal Gain\" DSP课程设计实验报告 slider amp1(0,1000,1,1,gainparameter) { Amp=gainparameter; } Fresaw.gel: menuitem \"Signal Frequency\" slider fre4(100,4000,1,1,freparameter) { Fre=freparameter; } 硬件仿真结果: DSP课程设计实验报告 添加GEL程序进行变量的滑块控制: DSP课程设计实验报告 此时设定输出幅度为452V,示波器测得电压为446V,输出频率为1421Hz。经测试仪测试为1421Hz,基本正确。 设计程序输出频率范围为100—4000Hz。 设计程序输出幅度范围为0-1000V。 六. 实验总结 张 本次DSP试验让我们基于DSP板来实现信号处理方面的相关要求。我们首先做的是把老师的课件复习一遍,重温了一遍老师课上讲过的知识点和相关仪器的使用方法,熟悉了使用流程之后才开始进行相关的编程。 在本次DSP课程设计中,我们对DSP芯片有了一些基本了解,掌握了 DSP课程设计实验报告 CCS开发环境的基本使用方法。因为之前选修过C语言和DSP图像处理课程,所以对一些基本的程序编写还有软件操作还是比较熟悉的。 我们选择的是波形发生器,首先我们参考了书本上的大概流程和思路,确定了大概的框架,然后具体用C语言编程序的时候参考了课本上的一些源程序,首先产生的正弦波就有几种方法,查表法就是先把正弦波相关的256个参数点存储起来,然后再调用出来,即可通过DSP板经过D/A转换将正弦波显示出来;还有泰勒级数法,计算法等相关方法,我们按照要求使用了计算法来实现相关的要求。编出来的程序其实核心也就是那么几十行,其他的很多都是固定套路,相关的定义和循环占了很大一部分,写出来程序容易但是真正去用板子调试的时候却并不是那么简单,有一些编译上的错误需要找一段时间才能发现并且改正,还有用CCS软件显示出的波形与模拟示波器上的波形并不一致,很多情况情况是一个图形显示出来效果很好,但是另一个图形却效果不理想,目前还不知道这其中是有怎样的联系,另一个就是实验基本部分要求实现波形的频率和幅度可调,我们用相关的式子定义了相关的参变量来调节上述两个参量,基本上达到了要求,但是其中的深层次原理并不是非常清楚,修改频率的同时可能也会改变波形的幅度,经过分析是因为dt不变,但是一个周期内的抽样点数却变了,所以变化的幅度就会有相应的增加或减少,解决这个问题的思路应该是找好N与f0的关系,对于这个问题由于时间原因我们并没有做进一步的研究。 总的来说,我们基本实现了实验要求的内容,部分拓展内容也有了相关结果,这次试验给了我很多的启发,不管怎样最后做出来了还是很高兴。 这次DSP课程设计,要求我们使用DSP产生任意信号波形,包括三角 DSP课程设计实验报告 波,锯齿波,矩形波等。在电路板上我们有时会做一些模拟的信号发生器,能够产生我们所需的信号波形,这一次要求用DSP产生任意信号波形,其实是一种数字方法的信号发生器。相比较而言,用DSP这种数字的方法产生多波形信号实则是利用了高速的运算能力来进行的,更加简单快捷。只不过同时需要用到D/A转换器。 利用DSP和D/A转换器可以产生连续的三角波,锯齿波和矩形波等各种信号波形。产生连续波形的方法一般有两种,查表法和计算法。查表法和计算法从字面上就很好理解,查表法是将需要输出的数据存储在DSP中然后依次输出,计算法则是以此计算数据后输出然后再计算再输出。由此可见,查表法速度快但需要占据存储空间而计算法反之。由于实验要求使用计算法于是选择计算法。此外,抽样点再送到D/A转换器之前要乘以32767,变为Q15的数据格式,以供D/A转换器进行数模转换处理。 上述是我们在开始之初的设计思路,随后就进入了编写程序,编译调试的阶段。新建工程项目,将事先编写好的程序放置在项目文件夹中并添加进去,随后进行编译链接,装载运行。由于我们还加入了GEL文件因此产生了两个小浮窗,可以调节频率和幅度。同时使用虚拟示波器对产生的信号波形进行观察。在编译调试阶段最不可缺少的就是细心和耐心! 这次课程设计让我收获良多。 七. 参考文献 [1]高海林、钱满义.DSP技术及其应用讲义.2005年10月 [2] TMS320Cx DSP CPU and Peripherals. Texas Instrument Inc,2001. [3] TMS320Cx DSP Applications and Guide. Texas Instrument Inc,2001. 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- sarr.cn 版权所有 赣ICP备2024042794号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务