Этот пример иллюстрирует создание всестороннего дополнения Excel®, чтобы выполнить спектральный анализ. Это требует знания Визуальных форм Basic® и средств управления и событий рабочей книги Excel. См. документацию VBA для полного обсуждения этих тем.
Вы создаете дополнение Excel, которое выполняет быстрое преобразование Фурье (FFT) на наборе входных данных, расположенном в обозначенной области значений рабочего листа. Функция возвращает результаты БПФ, массив точек частоты и степень спектральная плотность входных данных. Это помещает эти результаты в области значений, на которые вы указываете в текущем рабочем листе. Можно также опционально построить степень спектральная плотность.
Вы разрабатываете функцию так, чтобы вы могли вызвать ее из меню Excel Tools и могли выбрать области значений ввода и вывода через пользовательский интерфейс.
Создать дополнение:
Создайте автономный COM-компонент из кода MATLAB®.
Реализуйте необходимый код VBA, чтобы собрать вход и диспетчеризировать вызовы вашего компонента.
Создайте пользовательский интерфейс.
Создайте дополнение Excel и пакет все необходимые компоненты для развертывания приложения.
Ваш компонент имеет один класс с двумя методами:
computefft
— Вычислите БПФ и степень спектральная плотность входных данных, и вычислите вектор точек частоты на основе длины вводимых данных и интервал выборки.
plotfft
— Выполните те же операции как computefft
, но также и постройте входные данные и степень спектральная плотность в окне MATLAB Figure.
Код MATLAB для этих двух функций находится в двух файлах MATLAB, computefft.m
и plotfft.m
.
Код для computefft.m
:
function [fftdata, freq, powerspect] = computefft(data, interval) if (isempty(data)) fftdata = []; freq = []; powerspect = []; return; end if (interval <= 0) error('Sampling interval must be greater than zero'); return; end fftdata = fft(data); freq = (0:length(fftdata)-1)/(length(fftdata)*interval); powerspect = abs(fftdata)/(sqrt(length(fftdata)));
Код для plotfft.m.m
:
function [fftdata, freq, powerspect] = plotfft(data, interval) [fftdata, freq, powerspect] = computefft(data, interval); len = length(fftdata); if (len <= 0) return; end t = 0:interval:(len-1)*interval; subplot(2,1,1), plot(t, data) xlabel('Time'), grid on title('Time domain signal') subplot(2,1,2), plot(freq(1:len/2), powerspect(1:len/2)) xlabel('Frequency (Hz)'), grid on title('Power spectral density')
Создайте COM-компонент с помощью приложения Library Compiler и этих настроек:
Установка | Значение |
---|---|
Имя компонента | Fourier |
ClassName | Fourier |
Папка Project | Имя вашей папки работы, сопровождаемой именем компонента |
Покажите многословный вывод | Выбранный |
Для получения дополнительной информации см. инструкции в Create Дополнение Excel из MATLAB.
Для получения дополнительной информации о доступе к примеру кода из продукта, смотрите, что Файл В качестве примера Копирует.
Создав ваш компонент, можно реализовать необходимый код VBA, чтобы интегрировать его в Excel.
Чтобы использовать Fourier.xla
непосредственно в папке xlspectral
, (см., что Файл В качестве примера Копирует), добавляют ссылки на Fourier 1.0 Type Library и MWComUtil 7.X Type Library
.
Чтобы открыть Excel и выбрать библиотеки, необходимо разработать дополнение:
Запустите Excel в своей системе.
Из главного меню Excel выберите Tools> Macro> Visual Basic Editor.
В Visual Basic Editor выберите Tools> References, чтобы открыть диалоговое окно Project References.
Выберите библиотеку типов Fourier 1.0 и библиотеку типов MWComUtil 7.x.
Создайте Основной Модуль Кода VB для Приложения. Дополнение требует, чтобы переменные кода инициализации и глобальные переменные содержали состояние приложения между вызовами функции. Чтобы достигнуть этого, реализуйте модуль Visual Basic кода, чтобы управлять этими задачами:
Щелкните правой кнопкой по элементу VBAProject по окну проекта и выберите Insert> Module.
Новый модуль появляется под Модулями в Проекте VBA.
В странице свойств модуля, набор свойство Name
к FourierMain
.
Введите следующий код в модуле 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.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 Editor. Создать новую пользовательскую форму и заполнить его с необходимыми средствами управления:
Щелкните правой кнопкой по VBAProject по окну проекта VBA и выберите Insert> UserForm.
Новая форма появляется под Forms
в окне проекта VBA.
В странице свойств формы, набор свойство Name
к frmFourier
и свойство Caption
к Spectral Analysis
.
Добавьте ряд средств управления к незаполненному бланку:
Средства управления для спектрального анализа
Управляйте типом | Имя элемента управления | Свойства | Цель |
---|---|---|---|
|
| Заголовок = | Постройте входные данные и степень спектральная плотность. |
|
| Заголовок = Значение по умолчанию = верный | Выполните функцию, и отклоняет диалоговое окно. |
|
| Заголовок = Отмените = верный | Dismisse диалоговое окно, не выполняя функцию. |
|
| Заголовок = | Группа все элементы управления вводом. |
|
| Заголовок = | Группа все элементы управления выводом. |
|
| Заголовок = | Маркируйте |
TextBox | edtSample | Не применяется | Не применяется |
|
| Заголовок = | Маркируйте |
|
| Заголовок = | Маркируйте |
|
| Заголовок = | Маркируйте |
|
| Заголовок = | Маркируйте |
|
| Заголовок = | Маркируйте |
|
| Не применяется | Выберите область значений для входных данных. |
|
| Не применяется | Выберите выходную область значений для точек частоты. |
|
| Не применяется | Выберите выходную область значений для действительной части БПФ входных данных. |
|
| Не применяется | Выберите выходную область значений для мнимой части БПФ входных данных. |
|
| Не применяется | Выберите выходную область значений для степени спектральная плотность входных данных. |
Когда форма и средства управления будут завершены, щелкните правой кнопкой по форме и выберите код View.
Следующий листинг кода показывает код, чтобы реализовать. Заметьте, что этот код ссылается на управление и имена переменных, перечисленные в Средствах управления для Спектрального анализа. Если вы использовали различные имена для каких-либо из средств управления или какой-либо глобальной переменной, измените этот код, чтобы отразить те различия.
' '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
Добавьте пункт меню в Excel так, чтобы можно было открыть инструмент из меню Excel Tools. Для этого добавьте обработчики событий для событий AddinInstall
и AddinUninstall
рабочей книги, которые устанавливают и удаляют пункты меню. Пункт меню вызывает функцию LoadFourier
в модуле FourierMain
.
Реализовывать пункт меню:
Щелкните правой кнопкой по элементу 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
Сохраните дополнение в <project-folder>\for_testing
.
<project-folder>
относится к папке проекта, что Library Compiler раньше сохранял проект Фурье.
Назовите дополнение Spectral Analysis
.
Из главного меню Excel выберите File> Properties.
В диалоговом окне Workbook Properties кликните по вкладке Summary и введите Spectral Analysis
как заголовок рабочей книги.
Нажмите ОК, чтобы сохранить редактирования.
Из главного меню Excel выберите File> Save As.
В диалоговом окне Save As выберите Microsoft Excel Add-In (*.xla)
как тип файла и обзор к <project-folder>\for_testing
.
Введите Fourier.xla
как имя файла и нажмите Save.
Прежде, чем распределить дополнение, протестируйте его с демонстрационной проблемой. Спектральный анализ обычно используется, чтобы найти частотные составляющие сигнала проложенными под землей в шумном сигнале области времени. Создайте представление данных сигнала, содержащего два отличных компонента, и добавьте в него случайный компонент. Эти данные наряду с выводом хранятся в столбцах рабочего листа Excel, и вы строите сигнал временного интервала наряду со степенью спектральная плотность.
Запустите новый сеанс Excel с пустой рабочей книгой.
Из главного меню выберите Tools> Add-Ins.
В диалоговом окне Add-Ins нажмите Browse.
Просмотрите к папке <project-folder>\for_testing
, выберите Fourier.xla
и нажмите ОК.
Дополнение Спектрального анализа появляется в доступном Дополнительном списке и выбрано.
Нажмите ОК, чтобы загрузить дополнение.
Это дополнение устанавливает пункт меню в соответствии с меню Excel Tools. Чтобы отобразить Спектральный анализ пользовательский интерфейс, выберите Tools> Spectral Analysis. Прежде, чем вызвать дополнение, создайте некоторые данные, в этом случае сигнал с компонентами на уровне 15 Гц и 40 Гц. Выберите сигнал в течение 10 секунд на уровне выборки 0,01 с. Поместите моменты времени в столбец A и точки сигнала в столбец B.
Введите 0
для ячейки A1 в текущем рабочем листе.
Кликните по ячейке A2 и введите формулу "= A1 + 0.01"
.
Кликните и содержите нижний правый угол ячейки A2 и перетащите формулу вниз столбец к ячейке A1001. Эта процедура заполняет область значений A1:A1001 с интервалом 0–10 постепенно увеличенных 0,01.
Кликните по ячейке B1 и введите следующую формулу
"= SIN(2*PI()*15*A1) + SIN(2*PI()*40*A1) + RAND()"
Повторите процедуру перетаскивания, чтобы скопировать эту формулу во все ячейки в области значений B1:B1001.
Используя столбец данных (столбец B), протестируйте дополнение можно следующим образом:
Выберите Tools> Spectral Analysis из главного меню.
Кликните по полю Input Data.
Выберите диапазон B1:B1001
от рабочего листа или введите этот адрес в поле Input Data.
В поле Sampling Interval введите 0.01
.
Выберите сигнал области времени Plot и степень спектральная плотность.
Введите C1:C1001
для частотного вывода, и аналогично введите D1:D1001
, E1:E1001
и F1:F1001
для БПФ действительные и мнимые части и спектральная плотность.
Нажмите ОК, чтобы запустить анализ.
Следующие данные показывают вывод.
Степень спектральная плотность показывает два сигнала на уровне 15 Гц и 40 Гц.
Группируйте дополнение, COM-компонент и все библиотеки поддержки в самораспаковывающийся исполняемый файл. Этот пакет может быть установлен на других компьютерах, которые используют дополнение Spectral Analysis
.
На разделе Main File панели инструментов выберите одну из этих двух опций.
Опция | Что делает эта опция? | Когда я должен использовать эту опцию? |
---|---|---|
Runtime downloaded from web | Инсталлятор MATLAB Runtime загружает MATLAB Runtime с веб-сайта MathWorks. |
|
Runtime included in package | MATLAB Runtime включен в сгенерированный инсталлятор, который использует включенный MATLAB Runtime. |
|
Добавьте файлы других, которые были бы полезны для конечных пользователей.
Чтобы группировать дополнительные файлы или папки, добавьте их в поле Files installed for your end user. Смотрите Задают Файлы, чтобы Установить с Приложением.
Нажмите Package.
Чтобы установить это дополнение на другом компьютере, скопируйте пакет Fourier_pkg.exe
в ту машину, запустите его от командной строки и следуйте инструкциям в файле readme.txt
, который автоматически сгенерирован с вашим группированным выводом.