Создайте и интегрируйте функции спектрального анализа

Обзор

Этот пример иллюстрирует создание всестороннего дополнения Excel®, чтобы выполнить спектральный анализ. Это требует знания Визуальных форм Basic® и средств управления и событий рабочей книги Excel. См. документацию VBA для полного обсуждения этих тем.

Вы создаете дополнение Excel, которое выполняет быстрое преобразование Фурье (FFT) на наборе входных данных, расположенном в обозначенной области значений рабочего листа. Функция возвращает результаты БПФ, массив точек частоты и степень спектральная плотность входных данных. Это помещает эти результаты в области значений, на которые вы указываете в текущем рабочем листе. Можно также опционально построить степень спектральная плотность.

Вы разрабатываете функцию так, чтобы вы могли вызвать ее в меню Excel Tools и могли выбрать области значений ввода и вывода через пользовательский интерфейс.

Создать дополнение:

  1. Создайте автономный COM-компонент из кода MATLAB®.

  2. Реализуйте необходимый код VBA, чтобы собрать вход и диспетчеризировать вызовы вашего компонента.

  3. Создайте пользовательский интерфейс.

  4. Создайте дополнение Excel и пакет все необходимые компоненты для развертывания приложения.

Создание компонента

Ваш компонент имеет один класс с двумя методами:

  • computefft — Вычислите БПФ и степень спектральная плотность входных данных, и вычислите вектор из точек частоты на основе длины вводимых данных и интервал выборки.

  • plotfft — Выполните те же операции как computefft, но также и постройте входные данные и степень спектральная плотность в Графическом окне MATLAB.

Примечание

Код 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

Создав ваш компонент, можно реализовать необходимый код VBA, чтобы интегрировать его в Excel.

Примечание

Использовать Fourier.xla непосредственно в папке xlspectral, (см., что Файл В качестве примера Копирует), добавьте ссылки на Fourier 1.0 Type Library и MWComUtil 7. X Библиотека типов.

Выберите библиотеки

Чтобы открыть Excel и выбрать библиотеки, необходимо разработать дополнение:

  1. Запустите Excel в своей системе.

  2. Из главного меню Excel выберите Tools> Macro> Visual Basic Editor.

  3. В Visual Basic Editor выберите Tools> References, чтобы открыть диалоговое окно Project References.

  4. Выберите библиотеку типов Fourier 1.0 и библиотеку типов MWComUtil 7.x.

Создайте Основной Модуль Кода VB для Приложения.  Дополнение требует, чтобы переменные кода инициализации и глобальные переменные содержали состояние приложения между вызовами функции. Чтобы достигнуть этого, реализуйте модуль Visual Basic кода, чтобы управлять этими задачами:

  1. Щелкните правой кнопкой по элементу VBAProject по окну проекта и выберите Insert> Module.

    Новый модуль появляется под Модулями в Проекте VBA.

  2. В странице свойств модуля, набор Name свойство к FourierMain.

  3. Введите следующий код в 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

Разработайте пользовательский интерфейс для своего дополнения с помощью Visual Basic Editor. Создать новую пользовательскую форму и заполнить его с необходимыми средствами управления:

  1. Щелкните правой кнопкой по VBAProject по окну проекта VBA и выберите Insert> UserForm.

    Новая форма появляется под Forms в окне проекта VBA.

  2. В странице свойств формы, набор Name свойство к frmFourier и Caption свойство к Spectral Analysis.

  3. Добавьте ряд средств управления к незаполненному бланку:

    Средства управления для спектрального анализа

    Управляйте типомИмя элемента управленияСвойстваЦель

    CheckBox

    chkPlot

    Заголовок = Plot time domain signal and power spectral density

    Постройте входные данные и степень спектральная плотность.

    CommandButton

    btnOK

    Заголовок = OK

    Значение по умолчанию = верный

    Выполните функцию и отклоните диалоговое окно.

    CommandButton

    btnCancel

    Заголовок = Cancel

    Отмените = верный

    Dismisse диалоговое окно, не выполняя функцию.

    Frame

    Frame1

    Заголовок = Input Data

    Группа все элементы управления вводом.

    Frame

    Frame2

    Заголовок = Output Data

    Группа все элементы управления выводом.

    Label

    Label1

    Заголовок = Input Data:

    Маркируйте RefEdit для входных данных.

    TextBoxedtSample

    Не применяется

    Не применяется

    Label

    Label2

    Заголовок = Sampling Interval

    Маркируйте TextBox для интервала выборки.

    Label

    Label3

    Заголовок = Frequency:

    Маркируйте RefEdit для частотного вывода.

    Label

    Label4

    Заголовок = FFT - Real Part:

    Маркируйте RefEdit для действительной части БПФ.

    Label

    Label5

    Заголовок = FFT - Imaginary Part:

    Маркируйте RefEdit для мнимой части БПФ.

    Label

    Label6

    Заголовок = Power Spectral Density

    Маркируйте RefEdit для степени спектральная плотность.

    RefEdit

    refedtInput

    Не применяется

    Выберите область значений для входных данных.

    RefEdit

    refedtFreq

    Не применяется

    Выберите выходную область значений для точек частоты.

    RefEdit

    refedtReal

    Не применяется

    Выберите выходную область значений для действительной части БПФ входных данных.

    RefEdit

    refedtImag

    Не применяется

    Выберите выходную область значений для мнимой части БПФ входных данных.

    RefEdit

    refedtPowSpect

    Не применяется

    Выберите выходную область значений для степени спектральная плотность входных данных.

  4. Когда форма и средства управления будут завершены, щелкните правой кнопкой по форме и выберите код 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 так, чтобы можно было открыть инструмент в меню Excel Tools. Для этого добавьте обработчики событий для событий AddinInstall рабочей книги и AddinUninstall та установка и пункты меню удаления. Пункт меню вызывает LoadFourier функция в FourierMain модуль.

Реализовывать пункт меню:

  1. Щелкните правой кнопкой по элементу ThisWorkbook по окну проекта VBA и выберите код View.

  2. Поместите следующий код в 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
  3. Сохраните дополнение в <project-folder>\for_testing.

    <project-folder> относится к папке проекта, что Library Compiler раньше сохранял проект Фурье.

    Назовите дополнение Spectral Analysis.

    1. Из главного меню Excel выберите File> Properties.

    2. В диалоговом окне Workbook Properties кликните по вкладке Summary и введите Spectral Analysis как заголовок рабочей книги.

    3. Нажмите ОК, чтобы сохранить редактирования.

    4. Из главного меню Excel выберите File> Save As.

    5. В диалоговом окне Save As выберите Microsoft Excel Add-In (*.xla) как тип файла и обзор к <project-folder>\for_testing.

    6. Введите Fourier.xla как имя файла, и нажимают Save.

Протестируйте дополнение

Прежде, чем распределить дополнение, протестируйте его с демонстрационной проблемой. Спектральный анализ обычно используется, чтобы найти частотные составляющие сигнала проложенными под землей в шумном сигнале области времени. Создайте представление данных сигнала, содержащего два отличных компонента, и добавьте в него случайный компонент. Эти данные наряду с выходом хранятся в столбцах рабочего листа Excel, и вы строите сигнал временной области наряду со степенью спектральная плотность.

Создайте тестовую задачу

  1. Запустите новый сеанс Excel с пустой рабочей книгой.

  2. Из главного меню выберите Tools> Add-Ins.

  3. В диалоговом окне Add-Ins нажмите Browse.

  4. Просмотрите к <project-folder>\for_testing папка, выберите Fourier.xla, и нажмите ОК.

    Дополнение Спектрального анализа появляется в доступном Дополнительном списке и выбрано.

  5. Нажмите ОК, чтобы загрузить дополнение.

Это дополнение устанавливает пункт меню в соответствии с меню Excel Tools. Чтобы отобразить Спектральный анализ пользовательский интерфейс, выберите Tools> Spectral Analysis. Прежде, чем вызвать дополнение, создайте некоторые данные, в этом случае сигнал с компонентами на уровне 15 Гц и 40 Гц. Произведите сигнал в течение 10 секунд на частоте дискретизации 0,01 с. Поместите моменты времени в столбец A и точки сигнала в столбец B.

Создайте данные

  1. Введите 0 для ячейки A1 в текущем рабочем листе.

  2. Кликните по ячейке A2 и введите формулу "= A1 + 0.01".

  3. Кликните и содержите нижний правый угол ячейки A2 и перетащите формулу вниз по колонке к ячейке A1001. Эта процедура заполняет область значений A1:A1001 интервалом 0–10 постепенно увеличенных 0,01.

  4. Кликните по ячейке B1 и введите следующую формулу

    "= SIN(2*PI()*15*A1) + SIN(2*PI()*40*A1) + RAND()"

    Повторите процедуру перетаскивания, чтобы скопировать эту формулу во все ячейки в области значений B1:B1001.

Запустите тест

Используя столбец данных (столбец B), протестируйте дополнение можно следующим образом:

  1. Выберите Tools> Spectral Analysis из главного меню.

  2. Кликните по полю Input Data.

  3. Выберите B1:B1001 лежите в диапазоне от рабочего листа или введите этот адрес в поле Input Data.

  4. В поле Sampling Interval введите 0.01.

  5. Выберите сигнал области времени Plot и степень спектральная плотность.

  6. Введите C1:C1001 для частотного вывода, и аналогично вводят D1:D1001, E1:E1001, и F1:F1001 для БПФ действительные и мнимые части и спектральная плотность.

  7. Нажмите ОК, чтобы запустить анализ.

Следующий рисунок показывает выход.

Степень спектральная плотность показывает два сигнала на уровне 15 Гц и 40 Гц.

Пакет и распределяет дополнение

Группируйте дополнение, COM-компонент и все библиотеки поддержки в самораспаковывающийся исполняемый файл. Этот пакет может быть установлен на других компьютерах, которые используют Spectral Analysis дополнение.

  1. На разделе Main File панели инструментов выберите одну из этих двух опций.

    ОпцияЧто делает эта опция?Когда я должен использовать эту опцию?
    Runtime downloaded from webИнсталлятор MATLAB Runtime загружает MATLAB Runtime с веб-сайта MathWorks.
    • У вас есть многие конечные пользователи, которые часто развертывают приложения

    • У ваших пользователей есть доступ в Интернет

    • Ресурсы, такие как дисковое пространство, эффективность, и время вычислений являются значительными опасениями за вашу организацию

    Runtime included in packageMATLAB Runtime включен в сгенерированный инсталлятор, который использует включенный MATLAB Runtime.
    • У вас есть ограниченное количество конечных пользователей, которые развертывают несколько приложений в спорадических интервалах

    • У ваших пользователей нет доступа в Интернет

    • Ресурсы, такие как дисковое пространство, эффективность, и время вычислений не являются значительными проблемами

      Примечание

      Распределение MATLAB Runtime с приложением требует большего количества ресурсов.

  2. Добавьте файлы других, которые были бы полезны для конечных пользователей.

    Чтобы группировать дополнительные файлы или папки, добавьте их в поле Files installed for your end user. Смотрите Задают Файлы, чтобы Установить с Приложением.

  3. Нажмите Package.

Установите дополнение

Чтобы установить это дополнение на другом компьютере, скопируйте Fourier_pkg.exe пакет к той машине, запустите его от командной строки и следуйте инструкциям в readme.txt файл, который автоматически сгенерирован с вашим упакованным выходом.