构建和集成频谱分析功能

概述

这个例子说明了建立一个全面的Excel®插件进行光谱分析。它需要的视觉基本知识®窗体和控件,Excel工作簿的事件。请参阅VBA文档的完整讨论这些话题。

您创建一个Excel插件执行快速傅里叶变换(FFT)一组输入数据位于指定工作表范围内。函数返回FFT结果,一系列的频率点,和输入数据的功率谱密度。它把这些结果到你显示在当前工作表范围。你也可以选择绘制功率谱密度。

您开发的功能,这样您就可以从Excel调用它工具菜单,可以选择通过界面输入和输出范围。

创建插件:

  1. 从MATLAB构建一个独立的COM组件®代码。

  2. 实现必要的VBA代码收集输入和调度组件调用。

  3. 创建UI。

  4. 创建一个Excel插件,并为应用程序部署包所有必要的组件。

构建的组件

组件有一个类有两个方法:

  • computefft——计算FFT和输入数据的功率谱密度,并计算一个向量的频率点基于输入的数据的长度和采样间隔。

  • plotfft——执行相同的操作computefft,还画出输入数据和MATLAB的功率谱密度图窗口。

请注意

这两个函数的MATLAB代码在两个MATLAB文件,computefft.mplotfft.m

的代码computefft.m:

函数(fftdata、频率、powerspect] = computefft(数据,间隔)如果(isempty(数据))fftdata = [];频率= [];powerspect = [];返回;如果(间隔< = 0)错误(采样间隔必须大于零);返回;结束fftdata = fft(数据);频率=(0:长度(fftdata) 1) / ((fftdata) *长度区间);powerspect = abs (fftdata) / (sqrt(长度(fftdata)));

的代码plotfft.m.m:

函数(fftdata、频率、powerspect] = plotfft(数据,间隔)[fftdata,频率,powerspect] = computefft(数据,间隔);len =长度(fftdata);如果(len < = 0)返回;t = 0:间隔(len-1): *间隔;次要情节(2,1,1),情节(t)数据)包含(“时间”),网格标题(时域信号)次要情节(2,1,2),图(频率(1:len / 2), powerspect (1: len / 2)包含(“频率(赫兹)”),网格标题(功率谱密度)

使用库编译器构建COM组件应用这些设置:

设置 价值
组件名称 傅里叶
类名 傅里叶
项目文件夹 你的工作文件夹的名字,紧随其后的是组件的名称
显示详细的输出 选择

有关更多信息,请参见说明书从MATLAB创建Excel插件

示例代码在哪里?

关于访问示例代码的更多信息在产品,明白了示例文件复制

使用VBA集成组件

建立你的组件,您可以实现必要的VBA代码集成到Excel。

请注意

使用Fourier.xla直接在文件夹中xlspectral,(见示例文件复制)添加引用傅里叶1.0类型库MWComUtil 7。X类型库

选择库

打开Excel和选择库,你应该开发插件:

  1. 在您的系统启动Excel。

  2. 从主菜单,选择工具>>Visual Basic编辑器

  3. 在Visual Basic编辑器中,选择工具>引用项目引用对话框打开。

  4. 选择傅里叶1.0类型库MWComUtil 7。x类型库

为应用程序创建主要的VB代码模块。插件需要初始化代码和全局变量来保存应用程序状态函数之间的调用。为了达到这个目标,实现一个Visual Basic代码模块来管理这些任务:

  1. 右键单击VBAProject项目在项目窗口并选择插入>模块

    下面会出现一个新模块模块VBA项目

  2. 在模块属性页,设置的名字财产FourierMain

  3. 输入以下代码FourierMain模块:

    “FourierMain——主模块存储全局状态的控制和提供初始化代码的公共theFourier傅里叶。傅里叶'Global instance of Fourier object Public theFFTData As MWComplex 'Global instance of MWComplex to accept FFT Public InputData As Range 'Input data range Public Interval As Double 'Sampling interval Public Frequency As Range 'Output frequency data range Public PowerSpect As Range 'Output power spectral density range Public bPlot As Boolean 'Holds the state of plot flag Public theUtil As MWUtil 'Global instance of MWUtil object Public bInitialized As Boolean 'Module-is-initialized flag Private Sub LoadFourier() 'Initializes globals and Loads the Spectral Analysis form Dim MainForm As frmFourier On Error GoTo Handle_Error Call InitApp Set MainForm = New frmFourier Call MainForm.Show Exit Sub Handle_Error: MsgBox (Err.Description) End Sub Private Sub InitApp() 'Initializes classes and libraries. Executes once 'for a given session of Excel If bInitialized Then Exit Sub On Error GoTo Handle_Error If theUtil Is Nothing Then Set theUtil = New MWUtil Call theUtil.MWInitApplication(Application) End If If theFourier Is Nothing Then Set theFourier = New Fourier.Fourierclass End If If theFFTData Is Nothing Then Set theFFTData = New MWComplex End If bInitialized = True Exit Sub Handle_Error: MsgBox (Err.Description) End Sub

创建Visual Basic形式

开发一个用户界面使用Visual Basic编辑器插件。创建一个新用户表单并填充必要的控制:

  1. 右键单击VBAProjectVBA项目窗口,选择插入>UserForm

    一种新形式出现形式VBA项目窗口。

  2. 在表单属性页,设置的名字财产frmFourier标题财产光谱分析

  3. 空白表格中添加一系列的控制:

    控制光谱分析

    控制类型 控制的名字 属性 目的

    复选框

    chkPlot

    标题=情节时域信号和功率谱密度

    分析输入数据和功率谱密度。

    命令按钮

    btnOK

    标题=好吧

    默认= True

    执行功能和取消对话框。

    命令按钮

    btnCancel

    标题=取消

    取消= True

    Dismisse对话框没有执行这个函数。

    框架

    第一帧

    标题=输入数据

    集团所有的输入控件。

    框架

    Frame2

    标题=输出数据

    集团所有输出控制。

    标签

    Label1

    标题=输入数据:

    标签的RefEdit对输入数据。

    文本框 edtSample

    不适用

    不适用

    标签

    Label2

    标题=采样间隔

    标签的文本框采样间隔。

    标签

    Label3

    标题=频率:

    标签的RefEdit频率输出。

    标签

    Label4

    标题=FFT -实部:

    标签的RefEdit真正的FFT的一部分。

    标签

    Label5

    标题=FFT -虚部:

    标签的RefEditFFT的虚部。

    标签

    Label6

    标题=功率谱密度

    标签的RefEdit功率谱密度。

    RefEdit

    refedtInput

    不适用

    为输入数据选择范围。

    RefEdit

    refedtFreq

    不适用

    为频率点选择输出范围。

    RefEdit

    refedtReal

    不适用

    为真正的选择输出范围输入数据的FFT的一部分。

    RefEdit

    refedtImag

    不适用

    选择输出范围输入数据的FFT的虚部。

    RefEdit

    refedtPowSpect

    不适用

    选择输出范围输入数据的功率谱密度。

  4. 当表单和控制完成后,右键单击,并选择视图代码

    下面的代码清单显示了代码来实现。注意,这段代码中列出的控制和变量名引用控制光谱分析。如果您使用不同的名称的任何控制或任何全局变量,改变这段代码,以反映这些差异。

“frmFourier事件处理程序的私人潜艇UserForm_Activate ()“UserForm激活事件处理程序。这个函数被调用之前的表现形式,并初始化所有控件的值存储在全局变量中。On Error GoTo Handle_Error如果theFourier是没有或theFFTData没有那么退出子的初始化控制如果不是InputData没有那么refedtInput当前状态。= InputData文本。地址如果edtSample结束。文本格式=(间隔)如果不是频率没有那么refedtFreq。文本=频率。地址如果如果不是IsEmpty (theFFTData.Real)如果IsObject (theFFTData.Real)和TypeOf theFFTData。真正的范围那么refedtReal。= theFFTData.Real文本。地址如果结束结束如果没有IsEmpty (theFFTData.Imag)如果IsObject (theFFTData.Imag)和TypeOf theFFTData。图像放大然后refedtImag范围。= theFFTData.Imag文本。地址结束如果如果如果不是PowerSpect并不那么refedtPowSpect结束。= PowerSpect文本。地址如果chkPlot结束。价值 = bPlot Exit Sub Handle_Error: MsgBox (Err.Description) End Sub Private Sub btnCancel_Click() 'Cancel button click event handler. Exits form without computing fft 'or updating variables. Unload Me End Sub Private Sub btnOK_Click() 'OK button click event handler. Updates state of all variables from controls 'and executes the computefft or plotfft method. Dim R As Range If theFourier Is Nothing Or theFFTData Is Nothing Then GoTo Exit_Form On Error Resume Next 'Process inputs Set R = Range(refedtInput.Text) If Err <> 0 Then MsgBox ("Invalid range entered for Input Data") Exit Sub End If Set InputData = R Interval = CDbl(edtSample.Text) If Err <> 0 Or Interval <= 0 Then MsgBox ("Sampling interval must be greater than zero") Exit Sub End If 'Process Outputs Set R = Range(refedtFreq.Text) If Err = 0 Then Set Frequency = R End If Set R = Range(refedtReal.Text) If Err = 0 Then theFFTData.Real = R End If Set R = Range(refedtImag.Text) If Err = 0 Then theFFTData.Imag = R End If Set R = Range(refedtPowSpect.Text) If Err = 0 Then Set PowerSpect = R End If bPlot = chkPlot.Value 'Compute the fft and optionally plot power spectral density If bPlot Then Call theFourier.plotfft(3, theFFTData, Frequency, PowerSpect, _ InputData, Interval) Else Call theFourier.computefft(3, theFFTData, Frequency, PowerSpect, _ InputData, Interval) End If GoTo Exit_Form Handle_Error: MsgBox (Err.Description) Exit_Form: Unload Me End Sub

光谱分析菜单项添加到Excel

菜单项添加到Excel,这样您就可以打开工具从Excel工具菜单。要做到这一点,为工作簿添加事件处理程序的事件AddinInstallAddinUninstall安装和卸载菜单项。菜单项调用LoadFourier功能FourierMain模块。

实现菜单项:

  1. 右键单击ThisWorkbook项VBA项目窗口,并选择视图代码

  2. 将下面的代码放入ThisWorkbook

    私人潜艇Workbook_AddinInstall ()“外接程序安装叫AddFourierMenuItem结束时调用子私人潜艇Workbook_AddinUninstall ()“外接程序卸载叫RemoveFourierMenuItem结束时调用子私人潜艇AddFourierMenuItem()暗ToolsMenu CommandBarPopup昏暗NewMenuItem CommandBarButton“删除如果已经存在叫RemoveFourierMenuItem '找到工具菜单ToolsMenu = Application.CommandBars (1) .FindControl (ID: = 30007)如果ToolsMenu并不那么退出子的光谱分析添加菜单项设置NewMenuItem = ToolsMenu.Controls.Add NewMenuItem(类型:= msoControlButton)。标题= "光谱分析……”NewMenuItem.OnAction = "LoadFourier" End Sub Private Sub RemoveFourierMenuItem() Dim CmdBar As CommandBar Dim Ctrl As CommandBarControl On Error Resume Next 'Find tools menu and remove Spectral Analysis menu item Set CmdBar = Application.CommandBars(1) Set Ctrl = CmdBar.FindControl(ID:=30007) Call Ctrl.Controls("Spectral Analysis...").Delete End Sub
  3. 保存插件中<项目文件夹> \ for_testing

    <项目文件夹>指库编译器的项目文件夹,用于保存傅里叶项目。

    名字的插件光谱分析

    1. 从主菜单,选择文件>属性

    2. 在工作簿属性对话框中,单击总结选项卡,并输入光谱分析工作簿的标题。

    3. 点击好吧保存编辑。

    4. 从主菜单,选择文件>另存为

    5. 在“另存为”对话框中,选择Microsoft Excel插件(* .xla)文件类型,和浏览<项目文件夹> \ for_testing

    6. 输入Fourier.xla作为文件名,然后单击保存

测试插件

在分发插件之前,测试样品的问题。光谱分析是常用的找一个信号的频率成分埋在一个嘈杂的时域信号。创建一个数据表示的信号包含两个不同的组件,并添加一个随机组件。这些数据以及输出存储在一个Excel工作表的列,和你绘制时域信号功率谱密度。

创建测试问题

  1. 开始一个新的会话Excel空白工作簿。

  2. 从主菜单,选择工具>插件

  3. 在插件对话框中,单击浏览

  4. 浏览到<项目文件夹> \ for_testing文件夹,选择Fourier.xla,然后单击好吧

    光谱分析插件出现在可用的插件列表和选择。

  5. 点击好吧来加载插件。

该插件安装菜单项在Excel工具菜单。显示光谱分析界面,选择工具>光谱分析。创建一些数据,调用插件之前,在这种情况下一个信号与组件15赫兹和40 Hz。样本10秒信号的采样率为0.01。把时间点成列和信号点列B。

创建数据

  1. 输入0单元格A1在当前工作表。

  2. 单击细胞A2,键入公式“= A1 + 0.01”

  3. 点击并按住右下角的细胞A2和阻力公式列细胞A1001。这个过程充满A1范围:A1001间隔清廉增加了0.01。

  4. 单击B1,输入以下公式

    ”=罪(2 *π()* 15 * A1) +罪(2π* ()* 40 * A1) + RAND ()”

    重复这个过程拖到这个公式复制到所有的细胞都在B1: B1001。

运行测试

使用的数据列(列B),测试插件,如下所示:

  1. 选择工具>光谱分析从主菜单。

  2. 单击输入数据盒子。

  3. 选择B1: B1001从工作表,或者这个地址输入输入数据字段。

  4. 采样间隔字段,类型0.01

  5. 选择情节时域信号和功率谱密度

  6. 输入C1: C1001频率输出,同样输入D1: D1001,E1: E1001,外国游客1:F1001FFT实部和虚部,谱密度。

  7. 点击好吧运行分析。

下一个图显示了输出。

两个信号的功率谱密度显示15赫兹和40 Hz。

包和分发插件

打包插件,COM组件,所有支持库自解压的可执行文件。万博1manbetx这个包可以在其他电脑上安装使用光谱分析插件。

  1. 主文件将来发布的部分,选择这两个选项之一。

    选项 这个选项是干什么的? 我什么时候应该使用这个选项?
    运行时从web下载 MATLAB运行时安装程序下载MATLAB运行时从MathWorks网站。
    • 你经常有很多最终用户部署应用程序

    • 你的用户上网

    • 资源(如磁盘空间、性能和处理时间对组织非常重要

    运行时包含在包 MATLAB运行时是包括在生成的安装程序,它使用了包括MATLAB运行时
    • 你有一个有限的终端用户部署几个应用程序在零星的间隔

    • 用户没有访问互联网

    • 资源(如磁盘空间、性能和处理时间都不是重要的问题

      请注意

      分配MATLAB运行时与应用程序需要更多的资源。

  2. 添加其他文件,终端用户将是有用的。

    包额外的文件或文件夹,将它们添加到文件为您的终端用户安装字段。看到指定文件的安装与应用程序

  3. 点击包。

安装插件

在另一台电脑上安装这个插件,复制Fourier_pkg.exe包装机,从命令提示符运行它,并遵循的指令固定与你的打包文件自动生成输出。