labview图形显示正弦曲线信号发生器频率幅值相位数字示波器滤波器频谱分析
Posted 叶绿体不忘呼吸
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了labview图形显示正弦曲线信号发生器频率幅值相位数字示波器滤波器频谱分析相关的知识,希望对你有一定的参考价值。
wx供重浩:创享日记
对话框发送:labview图形
获取完整无水印报告+源程序文件
文章目录
例1.实时绘制正弦曲线
前面板.
(1)添加1个波形图表控件:控件选板→新式→图形→波形图表。
(2)添加1个停止按钮:控件选板→新式-→布尔→停止按钮。
设计的程序前面板如图9-1所示。
框图程序
(1)添加1个除法函数:函数选板→编程→数值→除。
(2)添加1个数值常量:函数选板→编程→数值→数值常量,将值改为10。
(3)添加1个正弦函数:函数选板→数学-→初等与特殊函数-→三角函数→正弦。
(4)添加1个定时函数:函数选板→编程→定时→时间延迟,延迟时间设为0. 5秒。
(5)添加1个While循环结构:函数选板→编程-→结构→While循环。按住鼠标左键,画出一个While循环的方框,将当前程序框图中的所有控件都置于While循环的方框中。
连线后的框图程序如图9-2所示。
运行程序
执行“运行”。程序运行界面如图9-3所示。
例2.实时绘制正弦曲线
前面板,
(1)添加1个波形图表控件:控件选板→新式→图形→波形图表。
(2)添加1个停止按钮:控件选板→新式→布尔→停止按钮。
设计的程序前面板如图9-4所示。
框图程序
(1)添加1个While循环结构:函数选板→编程-→结构→While循环结构。
(2)在While循环结构中添加1个除法函数:函数选板→编程-→数值→除。
(3)在While循环结构中添加1个数值常量:函数选板-→编程→数值→数值常量,将值改为10。
(4)在While循环结构中添加1个定时函数:函数选板→编程-→定时→时间延迟,延迟时间设为0.5秒。
(5)在While循环结构中添加1个正弦函数:函数选板→数学→初等与特殊函数→三角函数-→正弦。
(6)将波形图表控件、停止按钮控件的图标移到While循环结构中。
(7)将While循环的循环端屿除法函数的输入端口x相连。
(8)将数值常量10与除法函数的输入端口y相连。
(9)将除法函数的输出端口x/y与正弦函数的输入端口x相连。
(10)将正弦函数的输出端口sin(x)与波形图表控件相连。
(11)将停止按钮控件与While循环的条件端口相连。
连线后的框图程序如图9-5所示。
运行程序
执行“运行”。程序运行界面如图9-6所示。
例3.正弦信号发生器
前面板
(1)添加2个旋钮控件:控件选板-→新式→数值-→旋钮,并将标签分别改为“调节频率旋钮”和“调节幅值旋钮”。
(2)为了实时显示当前频率和幅值,添加2个数值显示控件:控件选板→新式→数值→数值显示控件,将标签分别改为“当前频率”和“当前幅值”。
(3)添加1个波形图表控件:控件选板→新式→图形→波形图表。
(4)添加1个停止按钮:控件选板→新式→布尔→停止按钮。
设计的程序前面板如图9-7所示。
框图程序
(1)添加1个正弦波形:函数选板→信号处理→波形生成→正弦波形。
(2)添加1个定时函数:函数选板→编程→定时→时间延迟,延迟时间设为0.5秒。
(3)添加1个While循环结构:函数选板→编程-→结构→While循环。按住鼠标左键,画出一个While循环的方框,将当前程序框图中的所有控件都置于While循环的方框中。
连线后的框图程序如图9-8所示。
运行程序
执行“运行”。在程序前面板通过转动旋钮改变输入值。以当前频率2,当前幅值2为例,程序运行界面如图9-9所示。
例4.频率、幅值可控的正弦波叠加一个幅值可控的噪声信号
前面板
(1)添加3个数值输入控件:控件选板→新式-→数值→数值输入控件,将标签分别改为正弦波幅值、正弦波频率、噪声幅值。
(2)添加1个波形图表控件:控件选板→新式-→图形→波形图表。
(3)添加1个停止按钮:控件选板→新式-→布尔→停止按钮。
设计的程序前面板如图9-10所示。
框图程序
(1)添加一个仿真信号:函数选板→信号处理→波形生成→基本函数发生器。这时,弹出下面的对话框,添加“均匀白噪声”即可。
(2)添加1个定时函数:函数选板→编程→定时→时间延迟,延迟时间设为0.5秒。
(3)添加1个While循环结构:函数选板→编程→结构→While循环。按住鼠标左键,画出一个While循环的方框,将当前程序框图中的所有控件都置于While循环的方框中。
连线后的框图程序如图9-11所示。
运行程序
执行“连续运行”。在程序前面板改变输入值。以正弦波幅值3,正弦波频率3,噪声幅值4为例,程序运行界面如图9-12所示。
例5.频率、幅值、相位可调的波形发生器
(1)添加3个数值输入控件:控件选板→新式-→数值→数值输入控件,将标签分别改为频率、幅值、相位。
(2)添加1个波形图表控件:控件选板→新式→图形→波形图表。
(3)添加1个停止按钮:控件选板→新式→布尔→停止按钮。
设计的程序前面板如图9-13所示。
框图程序
(1)添加一个基本函数发生器:函数选板→信号处理→波形生成→基本函数发生器,在其信号类型端口右键创建输入控件“信号类型”。
(2)添加1个While循环结构:函数选板→编程-→结构→While循环。按住鼠标左键,画出一个While循环的方框,将当前程序框图中的所有控件都置于While循环的方框中。
连线后的框图程序如图9-14所示。
运行程序
执行“连续运行”。在程序前面板改变输入值。以三角波,频率2,幅值3,相位3为例。
程序运行界面如图9-15所示。
例6.创建一个“数字示波器”
前面板.
(1)添加1个波形图表控件:控件选板→新式→图形→波形图表。
(2)添加2个数值输入控件:控件选板→新式→数值→数值输入控件,将标签分别改为频率、幅值。
(3)添加1个停止按钮:控件选板→新式→布尔→停止按钮。
设计的程序前面板如图9-16所示。(可以采用修饰控件进行适当的修饰)
框图程序
(1)添加1个公式波形:函数选板→信号处理-→波形生成-→公式波形。
(2)添加1个字符串常量:函数选板→编程-字符串→字符串常量,并输入公式: sin (wt) +cos (2w*t)^ 2。
(3)添加1个定时函数:函数选板→编程-→定时→时间延迟,延迟时间设为0.5秒。
连线后的框图程序如图9-17所示。
运行程序
执行“运行”。在程序前面板改变输入值。以频率10,幅值1为例,程序运行界面如下图所示(前面板已经进行了适当的修饰)。如果用户需要在示波器中显示其他类型的波形,只需要编辑公式即可。
程序运行界面如图9-18所示。
例7.数字滤波器的创建与调试
前面板
(1)添加2个波形图控件:控件选板→新式→图形→波形图,并将其中一个标签改为“滤波后的信号”。
(2)添加2个数值输入控件:控件选板→新式→数值→数值输入控件,将标签分别改为幅值、频率。
(3)添加1个停止按钮:控件选板→新式→布尔→停止按钮。
设计的程序前面板如图9-19所示。
框图程序
(1)添加2个正弦波形:函数选板→信号处理→波形生成→正弦波形。将第一个”正弦波形”的频率设置为1HZ,幅值设置为1V (添加2个数值常量)。
(2)添加1个加法函数:函数选板→编程→数值→加法函数。
(3)添加1个滤波器:函数选板-→Express→信号分析→滤波器。这时,弹出下面的对话框。
(2)添加1个While循环结构:函数选板→编程→结构→While循环。按住鼠标左键,画出一个While循环的方框,将当前程序框图中的所有控件都置于While循环的方框中。
连线后的框图程序如图9-20所示。
运行程序
执行“运行”。在程序前面板改变输入值。程序运行界面如图9-21所示。
左边的波形图显示了两个频率分别为1HZ和35HZ,幅值为1V的正弦波的叠加结果,右边的波形图窗口显示了经过低通滤波后的波形。可以明显发现,高频信号的幅值被极大的削减,显露出1HZ低频信号的波形,可见滤波器的设计是成功的。
例8.设计一个频谱分析仪器
前面板
(1)添加1个波形图控件:控件选板→新式→图形→波形图。
(2)添加1个停止按钮:控件选板→新式→布尔→停止按钮。
设计的程序前面板如图9-22所示。
框图程序
(1)添加1个仿真信号:函数选板→Express→输入→仿真信号。这时LabVIEW将自动弹出下面的对话框。如图9-23进行设置。
在信号类型下拉列表框中选择“正弦信号”;
在频率(HZ) -栏中将频率设为102HZ;
选中“添加噪声”复选框;
在噪声幅值一栏中设置噪声幅度为0.1。
(2)添加1个频谱测量:函数选板→Express→信号分析→频谱测量。这时LabVIEW将自动弹出下面的对话框。如图9-24进行设置。
在“频谱测量”对话框中“幅度(均方根)”;
在“窗”下拉列表中选择窗函数为“Hanning”窗;
选中“平均”选择框;
在“模式”一栏中选择平均方式为“均方根”。
连线后的框图程序如图9-25所示。
运行程序
执行“运行”。程序运行界面如图9-26所示。
例9.用XY图控件产生相位差相差45°和70°的椭圆和正圆
前面板.
(1)添加1个XY图控件:控件选板→新式→图形→XY图。
设计的程序前面板如图9-27所示。
框图程序
(1)添加1个For循环结构:函数选板→编程→结构→For循环。
(2)添加1个数值常量:函数选板→编程→数值→数值常量,将值改为3,与For循环结构的计数端口N相连。
(3)在For循环结构中添加1个条件结构:函数选板-→编程→结构→条件结构,并将条件结构的选择端口与For循环结构的循环端口相连。右键单击条件结构框架,在弹出菜单中选择“在后面添加分支”选项。
(4)在条件结构框架0、1和2中分别添加数值常量,将值分别改为45、70和90。
(5)在For循环结构中添加2个正弦信号函数:函数选板-→信号处理→信号生成→正弦信号。
(6)在For循环结构中添加1个捆绑函数:函数选板→编程-→簇与变体→捆绑。
(7)在For循环结构中添加1个定时函数:函数选板→编程→定时→等待下一个整数倍毫秒,将数值常量500与其输入端口相连。
连线后的框图程序如图9-28所示。
运行程序
执行“运行”。两个正弦函数节点产生的正弦信号经“捆绑”节点打包后送往XY图控件显示。两个正弦信号分别作为XY图控件的横坐标和纵坐标,如果两者的相位相差为45°和70°,显示的结果是两个具有不同曲率的椭圆;如果两者的相位相差为90°,显示的结果为一个正圆。
程序运行界面如图9-29所示。
(DDS)正弦波形发生器——幅值频率相位可调
(DDS)正弦波形发生器——幅值、频率、相位可调
一、项目任务:
- 设计一个幅值、频率、相位均可调的正弦波发生器。
- 频率每次增加1kHz。
- 相位每次增加 2*PI/256
- 幅值每次增加两倍
二、文章内容:
- DDS的核心原理。
- 分别使用两种方式完成频率可调(a、b),并且进行对比(c),最后对b进行优化(d)。
- 完成赋值、频率、相位可调的正弦波形发生器。(文章二)
1、DDS核心原理:
-
读取ROM中存储的波形数据获得一个基础波形(基频),之后不断进行循环读取。
-
幅值——ROM中取得数据使用乘法进行放大。
-
相位——改变从ROM中读取时,地址的初值。
-
调频——ROM时钟固定,控制读取ROM的地址来控制输出频率:
- 系统时钟为50MHz,ROM位宽为8,深度256。
- 有一个思路就是:先确定一个最小的频率,然后不断的对该频率进行放大,即可以控制频率的大小。反过来讲,就是先使用一种最慢的控制地址的读取ROM数据的方式,然后缩小读取的时间即可放大频率。
- 那么如何确定基频的大小呢?根据采取方法不同基频大小不定,但是为了频率的准确有以下几点需要注意:
- 基频小些比较好
- 基频越接近1、0.1、0.01、0.001······越好
2、两种产生基频的方式
a、32位寄存器基频:
-
使用一个32为寄存器,将高8位作为ROM的地址位,其余24位无特殊作用,寄存器按照系统时钟进行自加,此时高8位的变化频率与用于自加的系统时钟频率有了成倍的关系,很像计数器计数频率变化但存在区别,之后会讨论到。
-
系统时钟为50MHz,ROM位宽为8,深度256。那么基础频率为:
\\[% MathType!MTEF!2!1!+- % feaahqart1ev3aaatCvAUfeBSjuyZL2yd9gzLbvyNv2CaerbuLwBLn % hiov2DGi1BTfMBaeXatLxBI9gBaerbd9wDYLwzYbItLDharqqtubsr % 4rNCHbWexLMBbXgBd9gzLbvyNv2CaeHbl7mZLdGeaGqiVu0Je9sqqr % pepC0xbbL8F4rqqrFfpeea0xe9Lq-Jc9vqaqpepm0xbba9pwe9Q8fs % 0-yqaqpepae9pg0FirpepeKkFr0xfr-xfr-xb9adbaqaaeGaciGaai % aabeqaamaabaabauaajqgaG9FaceaapgGaamOzaOWaaSbaaSqaaiaa % dkgaaeqaaOGaeyypa0ZaaSaaaeaacaaI1aGaaGimaiabgEna0kaaig % dacaaIWaWaaWbaaSqabeaacaaI2aaaaaGcbaGaaGOmamaaCaaaleqa % baGaaGOmaiaaisdaaaGccqGHxdaTcaaIYaGaaGynaiaaiAdaaaGaey % ypa0JaaGimaiaac6cacaaIWaGaaGymaiaaigdacaaI2aGaaGinaiaa % igdacaaI1aGaamisaiaadQhaaaa!5ABC! f_b = \\frac50 \\times 10^62^24 \\times 256 = 0.0116415Hz \\] -
所以产生一个1kHz的正弦波(1kHz的ROM地址变化速度)只需要将基频放大1000/0.0116415 = 85899.34592,即扩大85899倍。
-
所以若想频率每次增加1kHz,在低24位每次自加85899即可,此时85899为频率控制字。
-
module addr_ctrl( input clk, input rst_n, output [7:0] addr ); reg [31:0] address; assign addr = address[31:24]; always @(posedge clk,negedge rst_n) begin if(rst_n == 0) address <= 32\'d0; else //address <= address + 32\'d858996; //10kHz address <= address + 32\'d85899; end endmodule
-
通过仿真可以看到准确的产生了1kHz的正弦波
-
//顶层 module digital_adds( input clk, input rst_n, output [7:0] data ); wire [7:0] addr; addr_ctrl addr_ctrl_inst( .clk (clk), .rst_n(rst_n), .addr (addr) ); rom1 rom1_inst ( .address ( addr ), .clock ( clk ), .q ( data ) ); endmodule
-
//测试文件 `timescale 1ns/1ps module digital_adds_tb(); reg clk; reg rst_n; wire [7:0] data; digital_adds digital_adds_inst( .clk (clk), .rst_n(rst_n), .data (data) ); initial clk = 1; always #10 clk = !clk; initial begin //同步复位信号需要时钟上升沿检测 rst_n = 0; #200 rst_n = 1; #5000000 $stop; end endmodule
b、计数器产生基频计算:
-
系统时钟为50MHz,ROM位宽为8,深度1024。
-
使用计数器产生1Hz的基频,方便之后扩频计算
\\[% MathType!MTEF!2!1!+- % feaahqart1ev3aaatCvAUfeBSjuyZL2yd9gzLbvyNv2CaerbuLwBLn % hiov2DGi1BTfMBaeXatLxBI9gBaerbd9wDYLwzYbItLDharqqtubsr % 4rNCHbWexLMBbXgBd9gzLbvyNv2CaeHbl7mZLdGeaGqiVu0Je9sqqr % pepC0xbbL8F4rqqrFfpeea0xe9Lq-Jc9vqaqpepm0xbba9pwe9Q8fs % 0-yqaqpepae9pg0FirpepeKkFr0xfr-xfr-xb9adbaqaaeGaciGaai % aabeqaamaabaabauaajqgaG9FaceaapgGaamOzaOWaaSbaaSqaaiaa % dkgaaeqaaOGaeyypa0ZaaSaaaeaacaaIXaGaaGimamaaCaaaleqaba % GaaGyoaaaaaOqaaiaaikdacaaIWaGaey41aqRaaGymaiaaicdacaaI % YaGaaGinaiabgEna0kaaisdacaaI4aGaaGioaiaaisdacaaI4aaaai % abg2da9iaaigdacaGGUaGaaGimaiaaicdacaaIWaGaaGimaiaaicda % caaIYaGaaGynaiaaiAdacaaIWaGaaGimaiaaicdacaaI2aGaaGynai % aadIeacaWG6baaaa!6128! f_b = \\frac10^920 \\times 1024 \\times 48828 = 1.0000025600065Hz \\] -
使用1024个数据,每个为20ns,共计48848次。
-
则频率控制字为1000时即可产生1kHz的正弦波。
-
//频率控制模块 module addr_ctrl( input clk, input rst_n, output reg [9:0] addr ); reg [15:0] cnt; always @(posedge clk,negedge rst_n) begin if(rst_n == 0) cnt <= 16\'d0; else if(16\'d48848 <= cnt) cnt <= 16\'d0; else cnt <= cnt + 16\'d1000; //频率控制字1kHz的基频 end always @(posedge clk,negedge rst_n) begin if(rst_n == 0) addr <= 10\'d0; else if(16\'d48848 <= cnt) addr <= addr + 10\'d1; else addr <= addr; end endmodule
-
图中可以看到,得到了977Hz的正弦波,存在着较大的误差,实际效果与理论计算严重不符,这是为什么呢?
c、对比
-
32位寄存器使用低位向高位进位可以确保每次加的数据都产生了效果,都向高位产生了进位。
-
相比使用计数器产生的基频很准确但是有着非常致命的缺点:
-
当频率控制字不能被计数器最大值整除,即当频率控制字即将累加到计数器最大值时,由于不能整除。可能还差一点点计数器就符合判断要求了,即已经非常接近我们预设的地址变化频率了,但是仍然不满足判断标准,必须等到下一次频率控制字的累加才可以使地址加一,这里就产生了理论计算和实际情况不同的问题。
-
其关键就是计数器进位是严格按照条件执行的少一点会不执行而多一点会被吞掉直接置零,舍弃掉了余数,并且由于cnt的初值从零开始且每次增加1000,说以实际上计算为:
\\[% MathType!MTEF!2!1!+- % feaahqart1ev3aaatCvAUfeBSjuyZL2yd9gzLbvyNv2CaerbuLwBLn % hiov2DGi1BTfMBaeXatLxBI9gBaerbd9wDYLwzYbItLDharqqtubsr % 4rNCHbWexLMBbXgBd9gzLbvyNv2CaeHbl7mZLdGeaGqiVu0Je9sqqr % pepC0xbbL8F4rqqrFfpeea0xe9Lq-Jc9vqaqpepm0xbba9pwe9Q8fs % 0-yqaqpepae9pg0FirpepeKkFr0xfr-xfr-xb9adbaqaaeGaciGaai % aabeqaamaabaabauaajqgaG9FaceaapgGaamOzaOWaaSbaaSqaaiaa % dkgaaeqaaOGaeyypa0ZaaSaaaeaacaaIXaGaaGimamaaCaaaleqaba % GaaGyoaaaaaOqaaiaaikdacaaIWaGaey41aqRaaGymaiaaicdacaaI % YaGaaGinaiabgEna0kaacIcacaaI0aGaaGyoaiabgUcaRiaaigdaca % GGPaGaey41aqRaaGymaiaaicdacaaIWaGaaGimaaaacqGH9aqpcaaI % WaGaaiOlaiaaiMdacaaI3aGaaGOnaiaaiwdacaaI2aGaaGOmaiaaiw % dacaWGibGaamOEaaaa!6290! f = \\frac10^1220 \\times 1024 \\times (49 + 1) \\times 1000 = 976.5625Hz \\]
-
-
该计算结果和仿真得到的结果相同,并且可以看到仿真保留了三位有效数字。
-
也就是说b法误差有两点原因:
- 忘记对cnt从零开始进行处理。
- 算法本身带来的一定误差。
- 忘记对cnt从零开始进行处理。
-
而低位向高位进位得到的计数器:
- 从零开始几乎不影响最终效果因为不参与循环不会累计误差
- 不会舍弃余数而是累加了起来
-
传统方法b还是好用一些,,,
-
我竟然品出了一点连续和离散的感觉出来。
d、对b进行修改
-
理论计算:
\\[% MathType!MTEF!2!1!+- % feaahqart1ev3aaatCvAUfeBSjuyZL2yd9gzLbvyNv2CaerbuLwBLn % hiov2DGi1BTfMBaeXatLxBI9gBaerbd9wDYLwzYbItLDharqqtubsr % 4rNCHbWexLMBbXgBd9gzLbvyNv2CaeHbl7mZLdGeaGqiVu0Je9sqqr % pepC0xbbL8F4rqqrFfpeea0xe9Lq-Jc9vqaqpepm0xbba9pwe9Q8fs % 0-yqaqpepae9pg0FirpepeKkFr0xfr-xfr-xb9adbaqaaeGaciGaai % aabeqaamaabaabauaajqgaG9FaceaapgGaamOzaOWaaSbaaSqaaiaa % dkgaaeqaaOGaeyypa0ZaaSaaaeaacaaIXaGaaGimamaaCaaaleqaba % GaaGymaiaaikdaaaaakeaacaaIYaGaaGimaiabgEna0kaaigdacaaI % WaGaaGOmaiaaisdacqGHxdaTcaaI0aGaaGyoaiabgEna0kaaigdaca % aIWaGaaGimaiaaicdaaaGaeyypa0JaaGyoaiaaiMdacaaI2aGaaiOl % aiaaisdacaaI5aGaaGOmaiaaiodacaaI0aGaaGOnaiaaiMdacaWGib % GaamOEaaaa!61D7! f_b = \\frac10^1220 \\times 1024 \\times 49 \\times 1000 = 996.4923469Hz \\] -
可以看到经过改进后:
- 理论计算和仿真验真结果相符。
- 产生波形的频率精度尚可。
-
module addr_ctrl( input clk, input rst_n, output reg [9:0] addr ); reg [15:0] cnt; always @(posedge clk,negedge rst_n) begin if(rst_n == 0) cnt <= 16\'d0; else if(16\'d48 <= cnt) //只要取倍数就可以了,并且要注意cnt初值为零已经多循环了一次 cnt <= 16\'d0; else cnt <= cnt + 16\'d1; //频率控制字1kHz的基频 end always @(posedge clk,negedge rst_n) begin if(rst_n == 0) addr <= 10\'d0; else if(16\'d48 <= cnt) addr <= addr + 10\'d1; else addr <= addr; end endmodule
至此文章1、2部分已经完成,第三部分的整体代码见下文
备注:
- ROM可以通过时钟和地址两种控制方式来使用。
- 第一个方法的图中我们可以看到准确的产生1kHz的正弦波,但是基频并非整数,为什么能够准确的产生1kHz的正弦波呢?是在哪一步忽略的,由于没有AD/DA也没有示波器没办法探究真实情况。
作者:野客居/13tree
出处:https://www.cnblogs.com/13tree/
本文版权归作者所有,如需转载请保留此段声明。
以上是关于labview图形显示正弦曲线信号发生器频率幅值相位数字示波器滤波器频谱分析的主要内容,如果未能解决你的问题,请参考以下文章