Этот пример иллюстрирует создание всестороннего Excel® дополнение, чтобы выполнить спектральный анализ. Это требует знания Visual Basic® формы и средства управления и события рабочей книги Excel. См. документацию VBA для полного обсуждения этих тем.
Вы создаете дополнение Excel, которое выполняет быстрое преобразование Фурье (FFT) на наборе входных данных, расположенном в обозначенной области значений рабочего листа. Функция возвращает результаты БПФ, массив точек частоты и спектральную плотность мощности входных данных. Это помещает эти результаты в области значений, на которые вы указываете в текущем рабочем листе. Можно также опционально построить спектральную плотность мощности.
Вы разрабатываете функцию так, чтобы можно было вызвать ее в меню Excel Tools и выбрать области значений ввода и вывода через пользовательский интерфейс.
Создать дополнение:
Создайте дополнение Excel из MATLAB® код.
Реализуйте необходимый код VBA, чтобы собрать вход и диспетчеризировать вызовы вашего компонента.
Создайте пользовательский интерфейс.
Сохраните законченное дополнение Excel и пакет все необходимые компоненты для развертывания приложения.
Прежде, чем создать дополнения Excel, необходимо установить поддерживаемый компилятор.
Сохраните путь к xlspectral
папка, которая поставляется с MATLAB.
copyfile(fullfile(matlabroot,'toolbox','matlabxl','examples','xlspectral'))
Исследуйте функции MATLAB computefft.m
и plotfft.m
.
Создайте Excel, добавляют - в с приложением Library Compiler или compiler.build.excelAddIn
.
Используйте следующую информацию для своего проекта:
Название проекта | Fourier |
ClassName | Fourier |
Файл, чтобы скомпилировать | plotfft.m |
Примечание
В этом примере, приложение, которое использует fourier
класс не вызывает computefft
непосредственно. computefft
метод требуется только plotfft
метод. Таким образом вы не должны вручную добавлять computefft
функционируйте к пакету, когда компилятор автоматически включает его во время анализа зависимостей.
Например, если вы используете compiler.build.excelAddIn
Ввод:
buildResults = compiler.build.excelAddIn('plotfft.m',... 'AddInName','Fourier',... 'ClassName','Fourier',... 'GenerateVisualBasicFile','on',... 'Verbose','on');
Ваш компонент имеет один класс с двумя методами:
computefft
— Вычисляет БПФ и спектральную плотность мощности входных данных, и вычисляет вектор из точек частоты на основе длины вводимых данных и интервал выборки.
plotfft
— Выполняет те же операции как computefft
, и также строит входные данные и спектральную плотность мощности в графическом окне MATLAB.
Создав ваш компонент, реализуйте необходимый код VBA, чтобы интегрировать его в Excel.
Примечание
Поставленное дополнение Excel Fourier.xla
в xlspectral
папка уже содержит код VBA. Чтобы использовать поставленный файл, откройте его в Excel, добавьте ссылки на Фурье 1.0 Библиотеки типов и MWComUtil X.X
Библиотека типов в Excel Visual Basic Editor, и сохраняет дополнение. Можно затем пропустить, чтобы Протестировать Дополнение.
Start Excel.
Откройте свое сгенерированное дополнение Excel.
От вкладки Developer нажмите Visual Basic или нажмите ALT +F11, чтобы открыть Visual Basic Editor. В более старых версиях Excel это может быть расположено под Tools> Macro> Visual Basic Editor.
В Visual Basic Editor выберите Tools> References, чтобы открыть диалоговое окно Project References.
Выберите Фурье 1.0 записи Библиотеки типов, которые соответствуют вашему сгенерированному дополнению Excel и MWComUtil X.X
Библиотека типов, которая соответствует вашей версии MATLAB или MATLAB Runtime. Нажмите OK.
Дополнение требует, чтобы переменные кода инициализации и глобальные переменные содержали состояние приложения между вызовами функции. Реализуйте модуль Visual Basic кода, чтобы управлять этими задачами.
Если уже нет подарка модуля под Модулями, щелкните правой кнопкой по элементу VBAProject по окну проекта и выберите Insert> Module.
Новый модуль появляется под Модулями в Проекте VBA.
В странице свойств модуля измените Name
свойство от Module1
к FourierMain
. Вы, возможно, должны показать окно свойств путем нажатия F4.
Введите следующий код в FourierMain
модуль и закрывает окно кода.
'
' FourierMain - Main module stores global state of controls
' and provides initialization code
'
Public theFourier As Fourier.Fourier '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.Fourier
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 Editor.
Щелкните правой кнопкой по VBAProject по окну проекта VBA и выберите Insert и затем UserForm.
Новая форма появляется под Forms
в окне проекта VBA.
В странице свойств формы, набор Name
свойство к frmFourier
и Caption
свойство к Spectral Analysis
.
Добавьте следующие средства управления в незаполненный бланк:
Средства управления для спектрального анализа
Управляйте типом | Имя элемента управления | Свойства | Цель |
---|---|---|---|
|
| Заголовок = | Постройте входные данные и спектральную плотность мощности. |
|
| Заголовок = Значение по умолчанию = верный | Выполните функцию и отклоните диалоговое окно. |
|
| Заголовок = Отмените = верный | Отклоните диалоговое окно, не выполняя функцию. |
|
| Заголовок = | Группа все элементы управления вводом. |
|
| Заголовок = | Группа все элементы управления выводом. |
| Label1 | Заголовок = | Маркируйте |
|
| Выберите область значений для входных данных. | |
|
| Заголовок = | Маркируйте |
TextBox | edtSample | Выберите интервал выборки. | |
|
| Заголовок = | Маркируйте |
|
| Выберите выходную область значений для точек частоты. | |
|
| Заголовок = | Маркируйте |
|
| Выберите выходную область значений для действительной части БПФ входных данных. | |
|
| Заголовок = | Маркируйте |
|
| Выберите выходную область значений для мнимой части БПФ входных данных. | |
|
| Заголовок = | Маркируйте |
|
| Выберите выходную область значений для спектральной плотности мощности входных данных. |
Ваша форма должна выглядеть похожей на следующее изображение. Текст в полях для вашей ссылки только.
Когда форма и средства управления будут завершены, щелкните правой кнопкой по форме и выберите View code.
Введите следующий код в окне формы кода. Если вы использовали различные имена для каких-либо из средств управления или какой-либо глобальной переменной, измените этот код, чтобы отразить те различия.
'
'frmFourier Event handlers
'
Private Sub UserForm_Activate()
'UserForm Activate event handler. This function gets called before
'showing the form, and initializes all controls with values stored
'in global variables.
On Error GoTo Handle_Error
If theFourier Is Nothing Or theFFTData Is Nothing Then Exit Sub
'Initialize controls with current state
If Not InputData Is Nothing Then
refedtInput.Text = InputData.Address
End If
edtSample.Text = Format(Interval)
If Not Frequency Is Nothing Then
refedtFreq.Text = Frequency.Address
End If
If Not IsEmpty (theFFTData.Real) Then
If IsObject(theFFTData.Real) And TypeOf theFFTData.Real Is Range Then
refedtReal.Text = theFFTData.Real.Address
End If
End If
If Not IsEmpty (theFFTData.Imag) Then
If IsObject(theFFTData.Imag) And TypeOf theFFTData.Imag Is Range Then
refedtImag.Text = theFFTData.Imag.Address
End If
End If
If Not PowerSpect Is Nothing Then
refedtPowSpect.Text = PowerSpect.Address
End If
chkPlot.Value = 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
Щелкните правой кнопкой по элементу ThisWorkbook по окну проекта VBA и выберите код View.
Поместите следующий код в ThisWorkbook
.
Private Sub Workbook_AddinInstall()
'Called when Addin is installed
Call AddFourierMenuItem
End Sub
Private Sub Workbook_AddinUninstall()
'Called when Addin is uninstalled
Call RemoveFourierMenuItem
End Sub
Private Sub AddFourierMenuItem()
Dim ToolsMenu As CommandBarPopup
Dim NewMenuItem As CommandBarButton
'Remove if already exists
Call RemoveFourierMenuItem
'Find Tools menu
Set ToolsMenu = Application.CommandBars(1).FindControl(ID:=30007)
If ToolsMenu Is Nothing Then Exit Sub
'Add Spectral Analysis menu item
Set NewMenuItem = ToolsMenu.Controls.Add(Type:=msoControlButton)
NewMenuItem.Caption = "Spectral Analysis..."
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
Код добавляет обработчики событий для событий AddinInstall
рабочей книги и
AddinUninstall
та установка и пункты меню удаления. Пункт меню вызывает LoadFourier
функция в FourierMain
модуль.
Когда вы будете закончены, кликните по значку сохранения или нажмите CTRL + S, чтобы сохранить дополнение.
Прежде, чем распределить дополнение, протестируйте его с демонстрационной проблемой. Спектральный анализ обычно используется, чтобы найти частотные составляющие сигнала проложенными под землей в шумном сигнале области времени. Создайте представление данных сигнала, содержащего два отличных компонента, и добавьте в него случайный компонент. Эти данные, наряду с выходом, хранятся в столбцах рабочего листа Excel, и вы строите сигнал временной области наряду со спектральной плотностью мощности.
Запустите новый сеанс Excel с пустой рабочей книгой.
От вкладки Developer выберите Excel Add-Ins.
В диалоговом окне Add-Ins нажмите Browse.
Просмотрите к Fourier.xla
и нажмите ОК.
Дополнение Спектрального анализа появляется в доступном списке Дополнений с установленным флажком.
Нажмите ОК, чтобы загрузить дополнение.
Это дополнение устанавливает пункт меню в соответствии с Дополнительным меню Excel.
Прежде, чем вызвать дополнение, создайте тестовые данные, который содержит сигнал с компонентами на уровне 15 Гц и 40 Гц. Произведите сигнал в течение 10 секунд на частоте дискретизации 0,01 с. Поместите моменты времени в столбец A и точки сигнала в столбец B.
Введите 0
в ячейку A1 в текущем рабочем листе.
Нажмите F5 или CTRL +G, чтобы запустить диалоговое окно Go To. Добавьте ссылочный A2:A1001 и нажмите OK, чтобы выбрать ячейки.
Введите формулу = A1 + 0.01
, затем нажмите CTRL +Enter, чтобы применить формулу к выбранным ячейкам.
Эта процедура заполняет область значений A1:A1001 интервалом 0–10 постепенно увеличенных 0,01.
Повторите процедуру Go To, чтобы ввести следующую формулу в каждую ячейку в области значений B1:B1001:
= SIN(2*PI()*15*A1) + SIN(2*PI()*40*A1) + RAND()
Используя столбец данных (столбец B), протестируйте дополнение.
Чтобы отобразить Спектральный анализ пользовательский интерфейс, выберите Add-ins> Spectral Analysis.
Кликните по полю Input Data.
Выберите B1:B1001
лежите в диапазоне от рабочего листа или введите эту область значений в поле Input Data.
В поле Sampling Interval введите 0.01
.
Выберите сигнал области времени Plot и спектральную плотность мощности.
Введите C1:C1001
для частотного вывода, и аналогично вводят D1:D1001
, E1:E1001
, и F1:F1001
для действительной части БПФ, мнимой части БПФ и спектральной плотности.
Нажмите ОК, чтобы запустить анализ.
Следующий рисунок показывает пример выхода.
Спектральная плотность мощности показывает два сигнала на уровне 15 Гц и 40 Гц.