2016-04-04 12 views
0

私は信号からfft関数の大きさをプロットする関数を持っています。MATLAB:データ反復からピークを見つける

繰り返しごとに、2000未満の2つのピークのx値を求めたいと思います。これは、関数findpeaksを使用して比較的単純だと思っていましたが、正しい出力を得られませんでした。

私は出力に含まをプロットするつもりはないが、ちょうど説明のためにここにプロットです。ここに私のコードのビットが

example of one iteration

:私だけ

enter image description here

(ピークの最初のセット)2000、以下のデータのピークを知るために一回の反復の例をしたいです。 Bは、解析が必要なデータのすべてのセグメントの開始インデックスを含むベクトルです。

function [number] = fourir_(data,sampling_rate) 

%Finds the approximate starting index of every peak segment 
%B is a vector containing the indeces 
[A,B] = findpeaks(double(abs(data) > 0.6), 'MinPeakDistance', 2500); 

Fs = sampling_rate; 
t = 0:1/Fs:0.25; 

C = zeros(size(B),2) 
    for i = 1:numel(B) 
    new_data = data(B(i):(B(i)+200)) 
    y = double(new_data)/max(abs(new_data)); 
    n = length(y); 
    p = abs(fft(y)); 
    f = (0:n-1)*(Fs/n); 

    end 

例データ:https://www.dropbox.com/s/zxypn3axoqwo2g0/signal%20%281%29.mat?dl=0

+0

「正しい出力を与えられていない」という意味の情報をさらに表示できますか?あなたは何を得て、何を期待しましたか? 'findpeaks'は低レベルノイズからピークに達する可能性があります。これは、あなたのサンプルシグナルから、私が最初にフィルタしたいと思うでしょう。たとえば、 'f(x> 2000)= 0;'は2000以下のピークを取得し、 'f(f <10)= 0;'は主要なピークのみを取得します。それで 'findpeaks(f)'は必要に応じて動作するでしょうか?そうでない場合は、Bのためのダミーデータを投稿して、人々が手助けできるようにしてください。 –

+0

@EdSmith私が知っている限り、 '' findpeaks''''はn * 1形式のデータしか取り込みません。この場合、データを変換して4桁のプロットを得ました。したがって、fの値だけから '' 'findpeaks'''''を取ると、私は明らかに私が望む値を得られません。これまでデータと全プログラムで質問を編集しました。次元数(反復回数)* 2の行列が必要です。列1では最初のピークが、列2では2番目のピークが必要です。 –

+0

申し訳ありませんが、あなたの変数に基づいて 'p'を意味しました。有用なピークを得るための答えを追加しますが、私は完全に理解しているかどうかはわかりません。 –

答えて

0

は、あなたの答えは、これは@Edスミスは彼の最初のコメントで提案まさにです。メジャーピークを区別するためにスレッショルドを追加することができます。

%Finds the approximate starting index of every peak segment 
%B is a vector containing the indeces 
[A,B] = findpeaks(double(abs(data) > 0.6), 'MinPeakDistance', 2500); 

Fs = sampling_rate; 
t = 0:1/Fs:0.25; 

C = zeros(size(B),2) 
    for i = 1:numel(B) 
    new_data = data(B(i):(B(i)+200)) 
    y = double(new_data)/max(abs(new_data)); 
    n = length(y); 
    p = abs(fft(y)); 
    f = (0:n-1)*(Fs/n); 
    p1 = p(1:round(length(p)/2)); 
    p1(p1<10) = 0; %add a threshold 
    [~,ind] = findpeaks(p1); %index of where are the peaks 
    C(i,:) = f(ind); 
    hold on 
    plot(f,p,'b',C(i,:),p(ind),'ro') 
    end 
0

以下が役立つかもしれない、あなたの信号データの1つのFFTからのピークを取得しているようだ、

clear all 
close all 

%load sample data from https://www.dropbox.com/s/zxypn3axoqwo2g0/signal%20%281%29.mat?dl=0 
load('./signal (1).mat') 

%get an FFT and take half 
p = abs(fft(signal)); 
p = p(1:length(p)/2); 

%find peaks and plot 
[pk, loc] = findpeaks(p,'MINPEAKHEIGHT',100,'MINPEAKDISTANCE',100); 

plot(p,'k-') 
hold all 
plot(loc, pk, 'rx') 

のように見え、

enter image description here

ピークのいくつかは単離されているated ...ここ

+0

あなたのソリューションをありがとう、しかし、このコードは私にすべての正しいピークを返しません(私は思うので、pはプロットされており、pとfの両方を考慮に入れることが重要です)。私は反復部分を追加して行列に書き込むのです)。私はあなたに良いアイデアを与えるために1つの反復のプロットを追加しました。この機能は、タッチトーンに関するブログhttp://blogs.mathworks.com/cleve/2014/09/01/touch-tone-telephone-dialing/に基づいています。 –

+1

fは単にサンプリングベクトルnoですか? fはピーク検出に関して何も変更しません!そして、あなたはしきい値のソリューションを実装しようとしましたか?エドの最初のコメントは解決策です! – obchardon

関連する問題