- 신규로 표시
- 북마크
- 구독
- 소거
- RSS 피드 구독
- 직접 링크 가져오기
- 인쇄
- 부적절한 컨텐트 신고
사인파 데이터에서 피크 추출
안녕하세요. 저는 시간에 따른 각도로 측정된 주기적 움직임의 일부 모션 데이터를 가지고 있습니다. 최소 및 최대 피크 값을 추출하는 방법이 있습니까? (저는 멍청한 놈이므로 간단한 설명이 가능합니다.) 아래 예입니다. 수동으로 수행해 왔지만 피크 수가 많은 일부 데이터가 있으므로 더 효율적인 방법을 원합니다. 많은 감사
원래 English (US) 로 작성된 이 게시물은 귀하의 편의를 위해 번역되었습니다. 답장을 보내면 English (US) 로 다시 번역됩니다.
채택된 솔루션
- 신규로 표시
- 북마크
- 구독
- 소거
- RSS 피드 구독
- 직접 링크 가져오기
- 인쇄
- 부적절한 컨텐트 신고
Re: 사인파 데이터에서 피크 추출
나는 이전 응답에서 더 설명적이어야했습니다.
JMP를 사용하여 사인파의 최고점과 최저점을 찾는 기능은 JMP에 내장된 분석 기능이 아닙니다.그러나 JMP의 스크립팅 언어(JSL)를 사용하면 스크립트를 사용하여 필요한 정보를 얻을 수 있습니다.
귀하의 질문에 대한 솔루션 작업을 시작하는 데 가장 먼저 필요한 것은 샘플 데이터 테이블이었습니다.JMP는 설치 시 제공하지만 귀하가 초기 질문에서 제공한 사인파와 유사한 사인파에 대한 데이터 값을 제공하는 것을 알지 못합니다.따라서 나만의 샘플 데이터 테이블을 만들어야 했습니다.내 스크립트의 첫 번째 부분은 샘플 데이터 테이블을 만드는 것 이상을 수행하지 않습니다.
Names Default To Here( 1 );
dt = New Table( "sine", New Column( "x" ), New Column( "y" ) );
For( k = 1, k <= 10, k++,
yfudgepos = Random Uniform( 0, .2 );
yfudgeneg = Random Uniform( 0, .2 );
For( x = 0, x <= 360, x++,
dt << add rows( 1 );
y = Sin( x / 180 * Pi() );
:x[Row()] = x + ((k - 1) * 360);
If( y < -1 * yfudgeneg,
:y[Row()] = y + yfudgeneg
);
If( y > yfudgepos,
:y[Row()] = y - yfudgePos
);
);
);
dt << select where(ismissing(:y));
dt << delete rows;Th
스크립트의 이 부분은 샘플 데이터 테이블을 생성합니다.완벽한 사인파 데이터 테이블이 아닙니다.
생성된 사인파가 각 파동에 대해 약간의 가변성을 갖기를 원했습니다. 이를 달성하기 위해 코드는 웨이브의 중간 위 또는 아래로 이동할 때마다 웨이브를 조정합니다. .최종 결과는 최대 고점이 다르고 각 파동마다 최소값이 다른 파동입니다.최종 결과 데이터 테이블에는 그러한 가변성이 있지만 파형에서 약간의 단계를 생성하기도 합니다.샘플 데이터 테이블이 완벽하지는 않지만 사용하기에 충분합니다.
다음은 위의 웨이브에 대한 데이터를 생성하는 스크립트의 일부입니다.
Names Default To Here( 1 );
dt = New Table( "sine", New Column( "x" ), New Column( "y" ) );
For( k = 1, k <= 10, k++,
yfudgepos = Random Uniform( 0, .2 );
yfudgeneg = Random Uniform( 0, .2 );
For( x = 0, x <= 360, x++,
dt << add rows( 1 );
y = Sin( x / 180 * Pi() );
:x[Row()] = x + ((k - 1) * 360);
If( y < -1 * yfudgeneg,
:y[Row()] = y + yfudgeneg
);
If( y > yfudgepos,
:y[Row()] = y - yfudgePos
);
);
);
dt << select where(ismissing(:y));
dt << delete rows;
그것이 생성하는 테이블은 다음과 같습니다
내가 만든 데이터 테이블에는 두 개의 열이 있습니다.하나는 X라고 하고 다른 하나는 Y라고 합니다. 열 이름은 원하는 이름으로 지정할 수 있습니다.X와 Y의 열 이름에 대한 참조를 열의 실제 이름이 무엇이든 교체하도록 스크립트를 변경하기만 하면 됩니다.
내가 제공한 실제 스크립트로 돌아가서....데이터 테이블이 생성되면 Graph Builder를 사용하여 데이터를 그래픽 형식으로 표시했습니다.
Graph Builder( Variables( X( :x ), Y( :y ) ), Elements( Points( X, Y, Legend( 3 ) ) ) );
이 JSL 문은 사인파 그래프를 표시했습니다.
다음 명령문은 데이터에서 최소값과 최대값을 실제로 검색하기 전에 5초 동안 그래프를 볼 수 있도록 스크립트 실행을 일시 중지합니다.
Wait( 5 );
나머지 JSL은 코드의 실제 작업 부분으로, 먼저 각 사인파의 최대 및 최소 지점을 찾은 다음 다음을 포함하는 새 데이터 테이블을 만듭니다.
각 웨이브에 대한 상단 및 하단 데이터 포인트.
// Find the min and max for each phase in the sine waves
dt << New Column("T or B",character);
// determine the starting direction of the wave
if(dt:y[1] dt:y[i],
dt:T or B[i] = "Bottom";
direction = "up";
)
);
dt << select where( :T or B != "" );
dtTB = dt << subset( selected columns(0), selected rows(1));
이 분석을 데이터에 적용하려면 먼저 내가 생성한 샘플 데이터 테이블과 같은 구조로 JMP 데이터 테이블에 데이터를 입력해야 합니다.그런 다음 데이터 열의 이름이 X와 Y라고 가정하고 아래 스크립트를 실행하여 새 테이블을 사용하여 데이터를 분석하고 각 웨이브의 최소값과 최대값을 찾으면 됩니다.
Names Default To Here( 1 );
dt = Current Data Table();
// Find the min and max for each phase in the sine waves
dt << New Column( "T or B", character );
// determine the starting direction of the wave
If( dt:y[1] < dt:y[2],
direction = "up",
direction = "down"
);
For( i = 1, i <= N Rows( dt ) - 1, i++,
If(
direction == "up" & dt:y[i + 1] < dt:y[i],
Show( i );
dt:T or B[i] = "Top";
direction = "down";,
direction == "down" & dt:y[i + 1] > dt:y[i],
dt:T or B[i] = "Bottom";
direction = "up";
)
);
dt << select where( :T or B != "" );
dtTB = dt << subset( selected columns( 0 ), selected rows( 1 ) );
- 신규로 표시
- 북마크
- 구독
- 소거
- RSS 피드 구독
- 직접 링크 가져오기
- 인쇄
- 부적절한 컨텐트 신고
Re: 사인파 데이터에서 피크 추출
다음은 사인파의 상단 및 하단 피크를 찾는 예입니다.스크립트는 먼저 몇 가지 예제 데이터를 생성한 다음 이동하여 상단 및 하단 피크를 찾습니다.
Names Default To Here( 1 );
dt = New Table( "sine", New Column( "x" ), New Column( "y" ) );
For( k = 1, k <= 10, k++,
yfudgepos = Random Uniform( 0, .2 );
yfudgeneg = Random Uniform( 0, .2 );
For( x = 0, x <= 360, x++,
dt << add rows( 1 );
y = Sin( x / 180 * Pi() );
:x[Row()] = x + ((k - 1) * 360);
If( y < -1 * yfudgeneg,
:y[Row()] = y + yfudgeneg
);
If( y > yfudgepos,
:y[Row()] = y - yfudgePos
);
);
);
dt << select where(ismissing(:y));
dt << delete rows;
Graph Builder( Variables( X( :x ), Y( :y ) ), Elements( Points( X, Y, Legend( 3 ) ) ) );
wait(5);
// Find the min and max for each phase in the sine waves
dt << New Column("T or B",character);
// determine the starting direction of the wave
if(dt:y[1] dt:y[i],
dt:T or B[i] = "Bottom";
direction = "up";
)
);
dt << select where( :T or B != "" );
dtTB = dt << subset( selected columns(0), selected rows(1));
원래 English (US) 로 작성된 이 게시물은 귀하의 편의를 위해 번역되었습니다. 답장을 보내면 English (US) 로 다시 번역됩니다.
- 신규로 표시
- 북마크
- 구독
- 소거
- RSS 피드 구독
- 직접 링크 가져오기
- 인쇄
- 부적절한 컨텐트 신고
Re: 사인파 데이터에서 피크 추출
정말 감사합니다. 어리석은 질문에 대해 죄송합니다. 그런 다음 이것을 내 데이터에 어떻게 적용합니까? 또한 0을 따라 작은 단계가 있는 이유를 설명해 주시겠습니까?
감사해요
스테프
원래 English (US) 로 작성된 이 게시물은 귀하의 편의를 위해 번역되었습니다. 답장을 보내면 English (US) 로 다시 번역됩니다.
- 신규로 표시
- 북마크
- 구독
- 소거
- RSS 피드 구독
- 직접 링크 가져오기
- 인쇄
- 부적절한 컨텐트 신고
Re: 사인파 데이터에서 피크 추출
나는 이전 응답에서 더 설명적이어야했습니다.
JMP를 사용하여 사인파의 최고점과 최저점을 찾는 기능은 JMP에 내장된 분석 기능이 아닙니다.그러나 JMP의 스크립팅 언어(JSL)를 사용하면 스크립트를 사용하여 필요한 정보를 얻을 수 있습니다.
귀하의 질문에 대한 솔루션 작업을 시작하는 데 가장 먼저 필요한 것은 샘플 데이터 테이블이었습니다.JMP는 설치 시 제공하지만 귀하가 초기 질문에서 제공한 사인파와 유사한 사인파에 대한 데이터 값을 제공하는 것을 알지 못합니다.따라서 나만의 샘플 데이터 테이블을 만들어야 했습니다.내 스크립트의 첫 번째 부분은 샘플 데이터 테이블을 만드는 것 이상을 수행하지 않습니다.
Names Default To Here( 1 );
dt = New Table( "sine", New Column( "x" ), New Column( "y" ) );
For( k = 1, k <= 10, k++,
yfudgepos = Random Uniform( 0, .2 );
yfudgeneg = Random Uniform( 0, .2 );
For( x = 0, x <= 360, x++,
dt << add rows( 1 );
y = Sin( x / 180 * Pi() );
:x[Row()] = x + ((k - 1) * 360);
If( y < -1 * yfudgeneg,
:y[Row()] = y + yfudgeneg
);
If( y > yfudgepos,
:y[Row()] = y - yfudgePos
);
);
);
dt << select where(ismissing(:y));
dt << delete rows;Th
스크립트의 이 부분은 샘플 데이터 테이블을 생성합니다.완벽한 사인파 데이터 테이블이 아닙니다.
생성된 사인파가 각 파동에 대해 약간의 가변성을 갖기를 원했습니다. 이를 달성하기 위해 코드는 웨이브의 중간 위 또는 아래로 이동할 때마다 웨이브를 조정합니다. .최종 결과는 최대 고점이 다르고 각 파동마다 최소값이 다른 파동입니다.최종 결과 데이터 테이블에는 그러한 가변성이 있지만 파형에서 약간의 단계를 생성하기도 합니다.샘플 데이터 테이블이 완벽하지는 않지만 사용하기에 충분합니다.
다음은 위의 웨이브에 대한 데이터를 생성하는 스크립트의 일부입니다.
Names Default To Here( 1 );
dt = New Table( "sine", New Column( "x" ), New Column( "y" ) );
For( k = 1, k <= 10, k++,
yfudgepos = Random Uniform( 0, .2 );
yfudgeneg = Random Uniform( 0, .2 );
For( x = 0, x <= 360, x++,
dt << add rows( 1 );
y = Sin( x / 180 * Pi() );
:x[Row()] = x + ((k - 1) * 360);
If( y < -1 * yfudgeneg,
:y[Row()] = y + yfudgeneg
);
If( y > yfudgepos,
:y[Row()] = y - yfudgePos
);
);
);
dt << select where(ismissing(:y));
dt << delete rows;
그것이 생성하는 테이블은 다음과 같습니다
내가 만든 데이터 테이블에는 두 개의 열이 있습니다.하나는 X라고 하고 다른 하나는 Y라고 합니다. 열 이름은 원하는 이름으로 지정할 수 있습니다.X와 Y의 열 이름에 대한 참조를 열의 실제 이름이 무엇이든 교체하도록 스크립트를 변경하기만 하면 됩니다.
내가 제공한 실제 스크립트로 돌아가서....데이터 테이블이 생성되면 Graph Builder를 사용하여 데이터를 그래픽 형식으로 표시했습니다.
Graph Builder( Variables( X( :x ), Y( :y ) ), Elements( Points( X, Y, Legend( 3 ) ) ) );
이 JSL 문은 사인파 그래프를 표시했습니다.
다음 명령문은 데이터에서 최소값과 최대값을 실제로 검색하기 전에 5초 동안 그래프를 볼 수 있도록 스크립트 실행을 일시 중지합니다.
Wait( 5 );
나머지 JSL은 코드의 실제 작업 부분으로, 먼저 각 사인파의 최대 및 최소 지점을 찾은 다음 다음을 포함하는 새 데이터 테이블을 만듭니다.
각 웨이브에 대한 상단 및 하단 데이터 포인트.
// Find the min and max for each phase in the sine waves
dt << New Column("T or B",character);
// determine the starting direction of the wave
if(dt:y[1] dt:y[i],
dt:T or B[i] = "Bottom";
direction = "up";
)
);
dt << select where( :T or B != "" );
dtTB = dt << subset( selected columns(0), selected rows(1));
이 분석을 데이터에 적용하려면 먼저 내가 생성한 샘플 데이터 테이블과 같은 구조로 JMP 데이터 테이블에 데이터를 입력해야 합니다.그런 다음 데이터 열의 이름이 X와 Y라고 가정하고 아래 스크립트를 실행하여 새 테이블을 사용하여 데이터를 분석하고 각 웨이브의 최소값과 최대값을 찾으면 됩니다.
Names Default To Here( 1 );
dt = Current Data Table();
// Find the min and max for each phase in the sine waves
dt << New Column( "T or B", character );
// determine the starting direction of the wave
If( dt:y[1] < dt:y[2],
direction = "up",
direction = "down"
);
For( i = 1, i <= N Rows( dt ) - 1, i++,
If(
direction == "up" & dt:y[i + 1] < dt:y[i],
Show( i );
dt:T or B[i] = "Top";
direction = "down";,
direction == "down" & dt:y[i + 1] > dt:y[i],
dt:T or B[i] = "Bottom";
direction = "up";
)
);
dt << select where( :T or B != "" );
dtTB = dt << subset( selected columns( 0 ), selected rows( 1 ) );
원래 English (US) 로 작성된 이 게시물은 귀하의 편의를 위해 번역되었습니다. 답장을 보내면 English (US) 로 다시 번역됩니다.
- 신규로 표시
- 북마크
- 구독
- 소거
- RSS 피드 구독
- 직접 링크 가져오기
- 인쇄
- 부적절한 컨텐트 신고
Re: 사인파 데이터에서 피크 추출
시간을 할애하여 이 자세한 답변을 작성해 주셔서 감사합니다! 훌륭하게 작동하게 되었습니다. 다시 한 번 감사드립니다!
원래 English (US) 로 작성된 이 게시물은 귀하의 편의를 위해 번역되었습니다. 답장을 보내면 English (US) 로 다시 번역됩니다.
- 신규로 표시
- 북마크
- 구독
- 소거
- RSS 피드 구독
- 직접 링크 가져오기
- 인쇄
- 부적절한 컨텐트 신고
Re: 사인파 데이터에서 피크 추출
유용한 답변을 찾았다면 "솔루션으로 수락"을 클릭하십시오. 이 솔루션이 귀하에게 도움이 되었음을 다른 사람들에게 강조합니다.
원래 English (US) 로 작성된 이 게시물은 귀하의 편의를 위해 번역되었습니다. 답장을 보내면 English (US) 로 다시 번역됩니다.