主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

创建使用多个 MATLAB 函数的 Java 应用程序

R2026a

此示例说明如何创建一个使用多个 Java® 函数来分析信号然后绘制结果图形的 MATLAB® 应用程序。

在此示例中,您执行以下步骤:

  1. 使用 MATLAB Compiler SDK™ 创建一个包,其中包含具有自动封装的私有方法的类。

  2. 在 MATLAB 应用程序中访问 Java 函数,包括使用 MWArray 类层次结构来表示数据。

  3. 构建并运行应用程序。

spectralanalysis 应用程序

spectralanalysis 应用程序分析信号并绘制结果图形。fourier 类对输入数据数组执行快速傅里叶变换 (FFT)。此类的方法 computefft 将该 FFT 的结果作为两个输出数组返回 - 频率点数数组和功率谱密度。

第二种方法 plotfft 绘制返回的数据图形。这两个方法 computefft 和 plotfft 封装了 MATLAB 函数。

文件

MATLAB 函数computefft.m
plotfft.m
MATLAB 函数位置matlabroot\toolbox\javabuilder\Examples\SpectraExample\SpectraDemoComp
Java 代码位置matlabroot\toolbox\javabuilder\Examples\SpectraExample\SpectraDemoJavaApp\powerspect.java

过程

  1. 将 MATLAB 附带的 SpectraExample 文件夹复制到您的工作文件夹:

    copyfile(fullfile(matlabroot,'toolbox','javabuilder','Examples','SpectraExample'),'SpectraExample')

    在 MATLAB 命令提示符下,导航到工作文件夹中的新 SpectraExample\SpectraDemoComp 子文件夹。

  2. 检查 MATLAB 函数 computefft.m 和 plotfft.m。

    function [fftdata, freq, powerspect] = computefft(data, interval)
    if (isempty(data))
       fftdata = [];
       freq = [];
       powerspect = [];
       return;
    end
    
    if (interval <= 0)
       error('BuilderJA:Examples:samplingInterval','Sampling interval must be greater then zero');
       return;
    end
    
    fftdata = fft(data);
    freq = (0:length(fftdata)-1)/(length(fftdata)*interval);
    powerspect = abs(fftdata)/(sqrt(length(fftdata)));
    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')
  3. 使用 Java 包编译器或 compiler.build.javaPackage 构建 Java 包。

    将以下信息用于您的工程:

    工程名称spectralanalysis
    类名fourier
    要编译的文件plotfft.m

    注意

    在这个示例中,使用 fourier 类的应用程序不会直接调用 computefft。只有 computefft 方法才需要 plotfft 方法。您不需要手动将 computefft 函数添加到包中,因为编译器会在依赖关系分析期间自动将其包含进去。

    例如,如果您使用的是 compiler.build.javaPackage,请输入:

    buildResults = compiler.build.javaPackage('plotfft.m', ...
    'PackageName','spectralanalysis', ...
    'ClassName','fourier');

    有关详细信息,请参阅生成 Java 包并编译 Java 应用程序中的说明。

  4. 为访问 MATLAB 函数的 Java 应用程序编写源代码。

    此示例的示例应用程序位于 SpectraExample\SpectraDemoJavaApp\powerspect.java 中。

    /* Necessary package imports */
    import com.mathworks.toolbox.javabuilder.*;
    import spectralanalysis.*;
    
    /*
     * powerspect class computes and plots the power
     * spectral density of an input signal.
     */
    class powerspect
    {
       public static void main(String[] args)
       {
          double interval = 0.01;     /* Sampling interval */
          int nSamples = 1001;        /* Number of samples */
          MWNumericArray data = null; /* Stores input data */
          Object[] result = null;     /* Stores result */
          fourier theFourier = null;  /* Fourier class instance */
    
          try
          {
             /*
              * Construct input data as sin(2*PI*15*t) + 
              * sin(2*PI*40*t) plus a random signal.
              *    Duration = 10
              *    Sampling interval = 0.01
              */
             int[] dims = {1, nSamples};
             data = MWNumericArray.newInstance(dims, MWClassID.DOUBLE,
                                                  MWComplexity.REAL);
             for (int i = 1; i <= nSamples; i++)
             {
                double t = (i-1)*interval;
                double x = Math.sin(2.0*Math.PI*15.0*t) +
                   Math.sin(2.0*Math.PI*40.0*t) + 
                   Math.random();
                data.set(i, x);
             }
    
             /* Create new fourier object */
             theFourier = new fourier();          
    
             /* Compute power spectral density and plot result */
             result = theFourier.plotfft(3, data, 
                Double.valueOf(interval));
             theFourier.waitForFigures(); 
          }
    
          catch (Exception e)
          {
             System.out.println("Exception: " + e.toString());
          }
    
          finally
          {
             /* Free native resources */
             MWArray.disposeArray(data);
             MWArray.disposeArray(result);
             if (theFourier != null)
                theFourier.dispose();
          }
       }
    }

    程序执行以下操作:

    • 构造一个输入数组,其值表示一个随机信号,其中包含两个频率分别为 15 Hz 和 40 Hz 的正弦波

    • 创建包含数据的 MWNumericArray 数组

      data = MWNumericArray.newInstance(dims, MWClassID.DOUBLE, MWComplexity.REAL);
      
    • 实例化 fourier 对象

    • 调用 plotfft 方法,该方法调用 computeftt 并绘制数据

    • 使用 try-catch 代码块处理异常

    • 使用 MWArray 方法释放本机资源

  5. 在 MATLAB 中,导航到 SpectraDemoJavaApp 文件夹。

  6. 将生成的 spectralanalysis.jar 包复制到此文件夹中。例如,如果您使用了 compiler.build.javaPackage,请输入:

    copyfile(fullfile('..','SpectraDemoComp','spectralanalysisjavaPackage','spectralanalysis.jar'))
  7. 打开命令提示符窗口并导航到 SpectraDemoJavaApp 文件夹。

  8. 使用 powerspect.java 编译 javac 应用程序。

    • 在 Windows® 上,执行以下命令:

      javac -classpath "<matlabroot>\toolbox\javabuilder\jar\javabuilder.jar";.\spectralanalysis.jar powerspect.java
    • 在 UNIX® 上,执行以下命令:

      javac -classpath "<matlabroot>/toolbox/javabuilder/jar/javabuilder.jar":./spectralanalysis.jar powerspect.java

    将 matlabroot 替换为 MATLAB 或 MATLAB Runtime 安装文件夹的路径。例如,对于 Windows,路径可能是 C:\Program Files\MATLAB\R2026a。

  9. 运行 powerspect 应用程序。

    • 在 Windows 上,执行以下命令:

      java -classpath .;"matlabroot\toolbox\javabuilder\jar\javabuilder.jar";.\spectralanalysis.jar powerspect
    • 在 UNIX 上,执行以下命令:

      java -classpath .:"matlabroot/toolbox/javabuilder/jar/javabuilder.jar":./spectralanalysis.jar powerspect
      

    注意

    如果您在 Mac 64 位平台上运行该应用程序,则必须在 Java 命令中添加 -d64 标志。

    powerspect 程序显示以下输出:

    Time domain signal plotted above the power spectral density plot that reveals signals at 16 and 40 Hz

另请参阅

|

主题