在matlab M文件中使用嵌套函数

时间:2013-03-21 12:58:25

标签: matlab

我有疑问,关于哪个我太感兴趣了,假设我在matlab中有两个M文件,在第一个我已经描述了以下用于计算峰值和峰值的函数

function [peaks,peak_indices] = find_peaks(row_vector)
    A = [0 row_vector 0];
    j = 1;
    for i=1:length(A)-2
        temp=A(i:i+2);
        if(max(temp)==temp(2))
            peaks(j) = row_vector(i);
            peak_indices(j) = i;
            j = j+1;
        end
    end
end

并且在第二个M文件中,我有用于描述给定数据样本的正弦模型的代码

function [ x ]=generate(N,m,A3)

f1 = 100;
f2 = 200;
T = 1./f1;
t = (0:(N*T/m):(N*T))';
wn = rand(length(t),1).*2 - 1;
x = 20.*sin(2.*pi.*f1.*t) + 30.*cos(2.*pi.*f2.*t) + A3.*wn;

end

我的问题是如何将它组合在一起?一个解决方案是将两个M文件创建到文件夹中,然后从一个M文件调用函数并对给定的向量进行操作并获得结果,然后从另一个调用第二个函数给定结果的M文件,最后得到我们想要的东西,但是我想在一个大的M文件中构建它,在c ++中,在java中,我们可以创建类,但我不确定我们是否也可以在matlab中做同样的事情,请帮我澄清一切,并使用find_peaks函数生成函数

更新: 好的,现在我想简单地改变我在代码中所做的事情

function [ x ] = generate(N,m,A3)
f1 = 100;
f2 = 200;
T = 1./f1;
t = (0:(N*T/m):(N*T))'; %'
wn = rand(length(t),1).*2 - 1;
x = 20.*sin(2.*pi.*f1.*t) + 30.*cos(2.*pi.*f2.*t) + A3.*wn;
[pks,locs] = findpeaks(x);
end

我在matlab中使用了findpeaks内置函数,但我收到了以下错误

generate(1000,50,50)
Undefined function 'generate' for input arguments of type 'double'.

我也感兴趣的是什么是有效的采样率以避免混淆?

2 个答案:

答案 0 :(得分:4)

您可以简单地将两者放在一个文件中。该文件必须与其中的第一个函数具有相同的名称,并且您将无法从该文件外部访问随后定义的函数。请参阅函数http://www.mathworks.co.uk/help/matlab/ref/function.html的MATLAB文档(特别是示例部分)。

另请注意,MATLAB有一个内置函数findpeaks()。

(顺便说一下,你仍然以太低的频率进行采样,并且肯定会出现锯齿 - 请参阅http://en.wikipedia.org/wiki/Aliasing#Sampling_sinusoidal_functions

编辑:正如您所要求的,这里有一些关于采样定理的更多信息。这些基础知识的简单介绍是http://www.dspguide.com/ch3/2.htm,为了进一步阅读,你应该搜索香农/奈奎斯特采样定理。

答案 1 :(得分:2)

在单个 MATLAB 脚本

中尝试使用此功能
function test()
clc, clear all, close all
x = generate(1000,50,50);
[p,i] = find_peaks(x)
end

function x = generate(N,m,A3)
f1 = 100;
f2 = 200;
T = 1./f1;
t = (0:(N*T/m):(N*T))'; %'
wn = rand(length(t),1).*2 - 1;
x = 20.*sin(2.*pi.*f1.*t) + 30.*cos(2.*pi.*f2.*t) + A3.*wn;
end

function [peaks,peak_indices] = find_peaks(row_vector)
    A = [0;row_vector;0];
    j = 1;
    for i=1:length(A)-2
        temp=A(i:i+2);
        if(max(temp)==temp(2))
            peaks(j) = row_vector(i);
            peak_indices(j) = i;
            j = j+1;
        end
    end
end