exponenta event banner

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

Обзор

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

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

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

Чтобы создать надстройку, выполните следующие действия.

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

  2. Внедрите код VBA, необходимый для сбора входных данных и отправки вызовов в компонент.

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

  4. Создайте надстройку 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-компонент с помощью приложения компилятора библиотеки и следующих параметров:

НастройкаСтоимость
Имя компонентаFourier
Имя классаFourier
Папка проектаИмя рабочей папки, за которым следует имя компонента
Показать подробные выходные данныеОтобранный

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

Где код примера?

Дополнительные сведения о доступе к коду примера из продукта см. в разделе Копирование файла примера.

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

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

Примечание

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

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

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

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

  2. В главном меню Excel выберите «Сервис» > «Макрос» > «Редактор Visual Basic».

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

  4. Выберите «Библиотека типов Фурье 1.0» и «Библиотека типов MWComUtil 7.x».

Создайте основной модуль кода VB для приложения.  Надстройка требует кода инициализации и глобальных переменных для сохранения состояния приложения между вызовами функций. Для этого необходимо внедрить модуль кода Visual Basic для управления следующими задачами:

  1. Щелкните правой кнопкой мыши элемент VBAProject в окне проекта и выберите «Вставка» > «Модуль».

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

  1. Щелкните правой кнопкой мыши VBAProject в окне проекта VBA и выберите Вставить > 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

    Отмена = Истина

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

    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. По завершении заполнения формы и элементов управления щелкните ее правой кнопкой мыши и выберите Показать код.

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

'
'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 и выберите Просмотр кода.

  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> ссылается на папку проекта, которую компилятор библиотеки использовал для сохранения проекта Фурье.

    Присвойте надстройке имя Spectral Analysis.

    1. В главном меню Excel выберите Файл > Свойства.

    2. В диалоговом окне «Свойства книги» перейдите на вкладку «Сводка» и введите Spectral Analysis в качестве заголовка рабочей книги.

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

    4. В главном меню Excel выберите «Файл» > «Сохранить как».

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

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

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

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

Создание проблемы тестирования

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

  2. В главном меню выберите Сервис > Надстройки.

  3. В диалоговом окне «Надстройки» нажмите кнопку «Обзор».

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

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

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

Эта надстройка устанавливает пункт меню в меню Инструменты Excel. Для отображения пользовательского интерфейса спектрального анализа выберите «Сервис» > «Спектральный анализ». Перед вызовом надстройки создайте некоторые данные, в данном случае сигнал с компонентами 15 Гц и 40 Гц. Выполните выборку сигнала в течение 10 секунд при частоте дискретизации 0,01 с. Поместите временные точки в столбец А, а сигнальные точки в столбец В.

Создание данных

  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. В главном меню выберите Сервис > Спектральный анализ.

  2. Щелкните поле Входные данные (Input Data).

  3. Выберите B1:B1001 диапазон от листа или введите этот адрес в поле Входные данные.

  4. В поле Интервал выборки введите 0.01.

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

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

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

На следующем рисунке показаны выходные данные.

Спектральная плотность мощности выявляет два сигнала с частотой 15 Гц и 40 Гц.

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

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

  1. В разделе «Главный файл» панели инструментов выберите одну из этих двух опций.

    ВыборЧто делает этот вариант?Когда следует использовать этот параметр?
    Среда выполнения загружена из ИнтернетаПрограмма установки среды выполнения MATLAB загружает среду выполнения MATLAB с веб-сайта MathWorks.
    • У вас много конечных пользователей, которые часто развертывают приложения

    • Пользователи имеют доступ в Интернет

    • Такие ресурсы, как дисковое пространство, производительность и время обработки, являются серьезными проблемами для организации

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

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

    • Такие ресурсы, как дисковое пространство, производительность и время обработки, не вызывают серьезных проблем

      Примечание

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

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

    Чтобы упаковать дополнительные файлы или папки, добавьте их в поле Файлы, установленные для конечного пользователя. См. раздел Указание файлов для установки с приложением.

  3. Щелкните Пакет (Package).

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

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