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

Обзор

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

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

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

Чтобы создать надстройку:

  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
Имя классаFourier
Папка проектаИмя рабочей папки и имя компонента
Показать подробный выходОтобранный

Для получения дополнительной информации см. инструкции в разделе Создание надстройки Excel из MATLAB.

Где находится код примера?

Для получения дополнительной информации о доступе к коду примера из продукта, смотрите Пример копирования файла.

Интеграция компонента с помощью VBA

Построив свой компонент, можно реализовать необходимый код VBA для интеграции его в Excel.

Примечание

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

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

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

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

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

  3. В редакторе Visual Basic выберите Tools > References, чтобы открыть диалоговое окно «Ссылки проекта».

  4. Выберите «Библиотека типов Фурье 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. Чтобы создать новую пользовательскую форму и заполнить ее необходимыми элементами управления:

  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

    По умолчанию = True

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

    CommandButton

    btnCancel

    Подпись = Cancel

    Отмена = True

    Закройте диалоговое окно, не выполняя функцию.

    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 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

Добавьте элемент меню спектрального анализа в Excel

Добавьте элемент меню в Excel, чтобы можно было открыть инструмент из меню Инструменты Excel. Для этого добавьте обработчики событий для событий книги AddinInstall и AddinUninstall установить и удалить элементы меню. Меню элемента вызывает LoadFourier функция в FourierMain модуль.

Для реализации элемента меню:

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

  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. В диалоговом окне Свойств книги» перейдите на вкладку «Сводка» и введите Spectral Analysis как заголовок книги.

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

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

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

    6. Введите Fourier.xla в качестве имени файла и нажмите кнопку «Сохранить».

Тестируйте надстройку

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

Создайте задачу тестирования

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

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

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

  4. Перейдите к <project-folder>\for_testing папка, выберите Fourier.xla, и нажмите OK.

    Надстройка Спектрального анализа появляется в доступном списке Add-Ins и выбирается.

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

Эта надстройка устанавливает элемент меню в меню Инструменты. Чтобы отобразить пользовательский интерфейс спектрального анализа, выберите Инструменты > Спектральный анализ. Перед вызовом надстройки создайте некоторые данные, в этом случае сигнал с компонентами на 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 область значений от листа или введите этот адрес в поле Входные данные.

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

  5. Выберите График временного интервала сигнал и степень спектральную плотность.

  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 packageСреда MATLAB Runtime включена в сгенерированный инсталлятор, который использует включённый MATLAB Runtime.
    • У вас есть ограниченное число конечных пользователей, которые развертывают несколько приложений со спорадическими интервалами

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

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

      Примечание

      Для распределения среды MATLAB Runtime с приложением требуется больше ресурсов.

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

    Чтобы упаковать дополнительные файлы или папки, добавьте их в поле Files installed for your end user. См. раздел «Указание файлов для установки в приложении».

  3. Щелкните Пакет.

Установка надстройки

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