2013-03-21 5 views
1

У меня вопрос, о котором я слишком заинтересован, предположим, что у меня есть два M-файла в matlab, в первом из которых я описал следующую функцию для вычисления разностей пиков и пиковиспользовать вложенные функции в M-файле MATLAB

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 

и второй М-файл у меня есть код для описания синусоидальной модели для данной выборки данных

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-файла и выполнили операцию с заданным вектором и ge t result, а затем вызывать вторую функцию из другого 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 

я использовал findpeaks встроенную функцию в MATLAB, но я получаю следующее сообщение об ошибке

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

также меня интересует, что было бы эффективной частотой дискретизации, чтобы избежать alliasing?

+0

Если вы стремитесь писать объектно-ориентированные коды внутри MATLAB (как в Java и C++), вы можете легко достигнуть этого! – fpe

ответ

3

Попробуйте с этим, в рамках одного 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 
+0

, но когда я запускаю тест, он показывает только некоторые значения нет, индексы для exmaple –

+0

Я отредактировал ответ. Кстати, я бы посоветовал обойти вашу пиковую функцию, чего можно избежать для циклов. – fpe

+0

использовать функцию findpeaks от matlab? Как я могу его использовать? –

5

Вы можете просто поместить оба файла в один файл. Файл должен иметь то же имя, что и первая функция в нем, и вы не сможете получить доступ к определенным впоследствии функциям из-за пределов этого файла. См. Документацию MATLAB по функциям http://www.mathworks.co.uk/help/matlab/ref/function.html (в частности, в разделе примеров).

Также обратите внимание, что MATLAB имеет встроенную функцию findpeaks().

(Кстати, вы по-прежнему выборки при слишком низкой частоте и наверняка получить ступенчатость - см http://en.wikipedia.org/wiki/Aliasing#Sampling_sinusoidal_functions)

Edit: Как вы просили его, вот еще некоторая информация по теореме Котельникова. Хорошее и простое введение в эти основы - http://www.dspguide.com/ch3/2.htm, и для дальнейшего чтения вам нужно найти теорему выборки Шеннона/Найквиста.

+0

, так что будет подходящей частотой выборки? –

+0

также является ошибкой этой неопределенной функции «generate» для входных аргументов типа «double». –

Смежные вопросы