0

あまりにも興味がある質問があります.matlabに2つの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

2番目の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

私の質問は、それを組み合わせる方法です.1つの解決策は、2つのMファイルをフォルダーに作成し、1つのMファイルから関数を呼び出し、指定されたベクトルで操作を行い、結果を取得してから、別のMファイルから2番目の関数を呼び出すことです結果が与えられ、最終的に必要なものが得られますが、C ++、Javaで1つの大きなMファイルにビルドしたいと思います。クラスを作成できますが、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'.

また、アリアシングを回避するための効果的なサンプリングレートは何ですか?

4

2 に答える 2

4

両方を 1 つのファイルに入れるだけです。ファイルは、最初の関数と同じ名前である必要があり、そのファイルの外部から後で定義された関数にアクセスすることはできません。関数に関する MATLAB ドキュメントhttp://www.mathworks.co.uk/help/matlab/ref/function.html (特に例のセクション) を参照してください。

また、MATLAB には組み込み関数 findpeaks() があることにも注意してください。

(ちなみに、まだ低すぎる周波数でサンプリングしているため、エイリアシングが確実に発生します - http://en.wikipedia.org/wiki/Aliasing#Sampling_sinusoidal_functionsを参照してください)

編集:あなたがそれを要求したように、ここにサンプリング定理に関するいくつかの詳細があります。これらの基本については、 http: //www.dspguide.com/ch3/2.htm に簡単に紹介されています。さらに読むには、Shannon/Nyquist サンプリング定理を検索してください。

于 2013-03-21T13:05:30.057 に答える
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
于 2013-03-21T13:18:35.213 に答える