이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.

신호 분석기

여러 개의 신호와 스펙트럼을 시각화하여 비교

설명

신호 분석기 앱은 시간 영역, 주파수 영역 및 시간-주파수 영역에서 신호를 시각화하고 전처리하고 측정하고 분석하고 비교할 수 있는 대화형 방식 툴입니다. 이 앱을 사용하여 다음을 수행할 수 있습니다.

  • MATLAB® 작업 공간에서 모든 신호에 손쉽게 액세스하기

  • 앱을 종료하지 않고 신호 스무딩, 필터링, 리샘플링, 추세 제거, 복제, 추출, 이름 바꾸기

  • 사용자 지정 전처리 함수를 추가하고 적용하기

  • 신호에 대한 여러 개의 파형, 스펙트럼, 지속성, 스펙트로그램 및 스케일로그램 표현을 동시에 시각화하고 비교하기

  • 분석이나 기계 학습 및 심층 학습 응용 사례를 위해 신호에 대화형 방식으로 레이블 지정하기

신호 분석기 앱에서는 기간이 각기 다른 여러 신호를 한번에 보며 동시에 작업할 수 있습니다.

자세한 내용은 신호 분석기 앱 사용하기를 참조하십시오.

스케일로그램 보기를 사용하려면 Wavelet Toolbox™ 라이선스가 필요합니다.

신호 분석기 앱 열기

  • MATLAB 툴스트립: 앱(Apps) 탭의 신호 처리 및 통신(Signal Processing and Communications)에서 앱 아이콘을 클릭합니다.

  • MATLAB 명령 프롬프트: signalAnalyzer를 입력합니다.

예제

모두 확장

기본적인 디지털 음악 신시사이저를 구현하고 이 신시사이저에서 3보이스 어레인지먼트로 노래를 재생합니다. 샘플 레이트를 2kHz로 지정합니다. 노래를 MATLAB® 타임테이블로 저장합니다.

fs = 2e3;
t = 0:1/fs:0.3-1/fs;

l = [0 130.81 146.83 164.81 174.61 196.00 220 246.94];
m = [0 261.63 293.66 329.63 349.23 392.00 440 493.88];
h = [0 523.25 587.33 659.25 698.46 783.99 880 987.77];
note = @(f,g) [1 1 1]*sin(2*pi*[l(g) m(g) h(f)]'.*t);

mel = [3 2 1 2 3 3 3 0 2 2 2 0 3 5 5 0 3 2 1 2 3 3 3 3 2 2 3 2 1]+1;
acc = [3 0 5 0 3 0 3 3 2 0 2 2 3 0 5 5 3 0 5 0 3 3 3 0 2 2 3 0 1]+1;

song = [];
for kj = 1:length(mel)
    song = [song note(mel(kj),acc(kj)) zeros(1,0.01*fs)];
end
song = song'/(max(abs(song))+0.1);

% To hear, type sound(song,fs)

tune = timetable(seconds((0:length(song)-1)'/fs),song);

신호 분석기를 열고 타임테이블을 작업 공간 브라우저에서 신호 테이블로 끌어서 놓습니다. 그리드 표시 ▼를 클릭하여 2x2 그리드를 생성합니다. 상단의 두 디스플레이와 왼쪽 하단의 디스플레이를 선택하고 스펙트럼 버튼을 클릭하여 스펙트럼 보기를 추가합니다. 오른쪽 하단 디스플레이를 선택하고 시간-주파수를 클릭하여 스펙트로그램 보기를 추가하고, 시간을 클릭하여 시간 보기를 제거합니다. 노래(song)를 4개의 모든 디스플레이로 끌어서 놓습니다. 오른쪽 하단 디스플레이를 선택하고 스펙트로그램 탭에서 시간 분해능을 0.31초(310밀리초)로 지정하고 인접하는 세그먼트 간의 중첩을 0%로 지정합니다. 전력 제한-50dB과 -10dB로 설정합니다.

분석기 탭에서 복제를 세 번 클릭하여 노래의 복사본을 세 개 만듭니다. 신호 테이블에서 이름 열을 더블 클릭하여 복사본 이름을 high, medium, low로 바꿉니다. 복사본을 상단의 두 디스플레이와 왼쪽 하단의 디스플레이로 옮깁니다.

필터를 사용하여 중복 신호를 전처리합니다.

  1. 신호 테이블에서 high 신호의 이름을 클릭하여 신호를 선택합니다. 분석기 탭에서 고역통과를 클릭합니다. 표시되는 고역통과 탭에서 통과대역 주파수를 450Hz로 입력하고 경사도를 0.95까지 높입니다. 고역통과를 클릭합니다.

  2. 신호 테이블에서 medium 신호의 이름을 클릭하여 신호를 선택합니다. 분석기 탭에서 전처리 ▼를 클릭하고 대역통과를 선택합니다. 표시되는 대역통과 탭에서 하부 통과대역 주파수와 상부 통과대역 주파수를 각각 230Hz와 450Hz로 입력합니다. 경사도를 0.95까지 높입니다. 대역통과를 클릭합니다.

  3. 신호 테이블에서 low 신호의 이름을 클릭하여 신호를 선택합니다. 분석기 탭에서 저역통과를 클릭합니다. 표시되는 저역통과 탭에서 통과대역 주파수를 230Hz로 입력하고 경사도를 0.95까지 높입니다. 저역통과를 클릭합니다.

필터링된 신호가 포함된 세 개의 디스플레이 각각에서 다음을 수행합니다.

  1. 원래 신호 이름 옆에 있는 체크박스 선택을 취소하여 원래 신호를 제거합니다.

  2. 표시 탭에서 시간-주파수를 클릭하여 스펙트로그램 보기를 추가하고, 시간을 클릭하여 시간 보기를 제거합니다.

  3. 스펙트로그램 탭에서 시간 분해능을 0.31초로 지정하고 인접하는 세그먼트 간의 중첩을 0%로 지정합니다. 전력 제한-50dB과 -10dB로 설정합니다.

신호 테이블에서 해당 이름 열을 클릭하여, 필터링된 세 개 신호를 선택합니다. 분석기 탭에서 내보내기를 클릭하고 신호를 music.mat라는 MAT 파일로 저장합니다. MATLAB에서 파일을 작업 공간으로 불러옵니다. 세 신호의 스펙트럼을 플로팅합니다.

load music

pspectrum(low)
hold on
pspectrum(medium)
pspectrum(high)
hold off

% To hear the different voices, type 
% sound(low.Var1,fs), pause(5), sound(medium.Var1,fs), pause(5), sound(high.Var1,fs)

태평양 흰긴수염고래의 오디오 데이터를 4kHz로 샘플링한 파일을 불러옵니다. 이 파일은 코넬대 생물 음향학 연구 프로그램(Cornell University Bioacoustics Research Program)에서 관리하는 동물 소리 라이브러리에서 생성된 것입니다. 피치를 올려서 울음소리가 더 잘 들리도록 데이터의 시간 스케일을 1/10로 압축했습니다. 신호를 MATLAB® 타임테이블로 변환합니다.

whaleFile = fullfile(matlabroot,'examples','matlab','bluewhale.au');
[w,fs] = audioread(whaleFile);

whale = timetable(seconds((0:length(w)-1)'/fs),w);

% To hear, type soundsc(w,fs)

신호 분석기를 열고 타임테이블을 디스플레이로 끌어서 놓습니다. 잡음에서 네 가지 특징이 두드러집니다. 첫 번째 소리는 짧게 반복되는 소리이고 나머지 세 번의 소리는 긴 울음소리입니다.

표시 탭에서 스펙트럼을 클릭하여 스펙트럼 보기를 열고 패너를 클릭하여 패너를 활성화합니다. 패너를 사용하여 약 2초의 너비를 갖는 확대/축소 창을 생성합니다. 짧게 반복되는 소리의 가운데에 오도록 확대/축소 창을 끌어서 놓습니다. 스펙트럼을 통해 약 900Hz에서 피크가 두드러짐을 알 수 있습니다.

다음과 같이 긴 울음소리 세 개를 추출하여 해당 스펙트럼을 비교합니다.

  1. 패너 확대/축소 창을 첫 번째 긴 울음소리의 가운데에 오도록 합니다. 스펙트럼을 보면, 명확히 정의된 피크 8개가 170Hz의 배수에 매우 근접한 지점에서 나타납니다. 신호 추출 ▼을 클릭하고 Between Time Limits를 선택합니다.

  2. 패너를 클릭하여 패너를 숨깁니다. 스페이스바를 눌러 전체 신호를 표시합니다. X축 확대를 클릭하여 두 번째 긴 울음소리의 가운데에 있는, 2초 간격의 시간 보기를 확대합니다. 스펙트럼의 피크가 다시 170Hz의 배수에서 발생합니다. 신호 추출 ▼을 클릭하고 Between Time Limits를 선택합니다.

  3. 스페이스바를 눌러 전체 신호를 표시합니다. 데이터 커서 ▼를 클릭하고 Two를 선택합니다. 2초 간격의 시간 영역 커서를 세 번째 긴 울음소리 주위에 놓습니다. 다시 170Hz의 배수에서 피크가 발생합니다. 신호 추출 ▼을 클릭하고 Between Time Cursors를 선택합니다.

신호 테이블에서 원래 신호 이름 옆에 있는 체크박스 선택을 취소하여, 디스플레이에서 원래 신호를 제거합니다. 방금 추출한 관심 영역 세 개를 표시합니다. 해당 스펙트럼들이 거의 서로 겹쳐져 있습니다. 주파수 영역 커서를 첫 번째와 세 번째 스펙트럼의 피크 위치로 가져갑니다. 커서 레이블에 별표가 표시되면 보간된 신호 값임을 나타냅니다.

큰갈색박쥐(Eptesicus fuscus)가 발사한 반향정위 펄스를 7마이크로초의 샘플링 간격으로 측정한 데이터 파일을 불러옵니다. 신호와 시간 정보를 사용하여 MATLAB® 타임테이블을 생성합니다.

load batsignal

t = (0:length(batsignal)-1)*DT;
sg = timetable(seconds(t)',batsignal);

신호 분석기를 열고 타임테이블을 작업 공간 브라우저에서 신호 테이블로 끌어서 놓습니다. 그리드 표시 ▼를 클릭하여 두 디스플레이를 나란히 생성합니다. 각 디스플레이를 선택하고 시간-주파수 버튼을 클릭하여 스펙트로그램 보기를 추가합니다.

타임테이블을 두 디스플레이로 끌어서 놓습니다.

스펙트로그램 탭을 선택합니다. 오른쪽 디스플레이에서 재할당을 선택합니다. 각 디스플레이에 대해 다음을 수행하십시오.

  • 시간 분해능을 280마이크로초로 설정하고 인접 세그먼트 간의 중첩을 85%로 지정합니다.

  • 누설 슬라이더를 사용하여 RBW가 약 4.5kHz가 될 때까지 누설을 증가시킵니다.

  • 전력 제한을 –45dB와 –20dB로 설정합니다.

재할당된 스펙트로그램이 세 개의 시간-주파수 리지를 명확히 표시합니다. 리지를 추적하기 위해 오른쪽 디스플레이를 선택합니다. 표시 탭에서 스크립트 생성을 클릭하고 Spectrogram Script를 선택합니다. 편집기에 스크립트가 나타납니다.

% Compute spectrogram

% Generated by MATLAB(R) 9.7 and Signal Processing Toolbox 8.2.
% Generated on: 26-Dec-2018 17:21:44

% Parameters
timeLimits = seconds([0 0.002793]); % seconds
frequencyLimits = [0 71428.57]; % Hz
leakage = 0.9;
timeResolution = 0.00028; % seconds
overlapPercent = 85;
reassignFlag = true;

%%
% Index into signal time region of interest
sg_batsignal_ROI = sg(:,'batsignal');
sg_batsignal_ROI = sg_batsignal_ROI(timerange(timeLimits(1),timeLimits(2),'closed'),1);

% Compute spectral estimate
% Run the function call below without output arguments to plot the results
[P,F,T] = pspectrum(sg_batsignal_ROI, ...
    'spectrogram', ...
    'FrequencyLimits',frequencyLimits, ...
    'Leakage',leakage, ...
    'TimeResolution',timeResolution, ...
    'OverlapPercent',overlapPercent, ...
    'Reassign',reassignFlag);

스크립트를 실행합니다. 재할당된 스펙트로그램을 플로팅합니다.

mesh(seconds(T),F,P)
xlabel('Time')
ylabel('Frequency')
axis tight
view(2)
colormap pink

tfridge 함수를 사용하여 리지를 추적합니다.

[fridge,~,lridge] = tfridge(P,F,0.01,'NumRidges',3,'NumFrequencyBins',10);

hold on
plot3(seconds(T),fridge,P(lridge),':','linewidth',3)
hold off

박쥐에 대한 데이터를 제공해 주시고 이 예제에서 사용하도록 허락해 주신 일리노이대학교 베크만 센터(Beckman Center)의 Curtis Condon, Ken White, Al Feng 님께 감사드립니다.

데이터가 지정된 포화 지점보다 큰 경우 센서는 잘린 측정값을 반환할 수 있습니다. 측정값을 복원하려면 포화된 구간에 인접한 점을 지나도록 다항식을 피팅하면 됩니다. 복원을 수행하는 함수를 작성한 다음 신호 분석기에 통합합니다.

14초 동안 1kHz로 샘플링된 3채널 신호를 생성합니다. 신호에는 크기와 형태가 다양한 여러 개의 피크가 포함되어 있습니다. 신호를 읽어 들이는 센서가 0.1V에서 포화됩니다.

fs = 1000;
t = 0:1/fs:14-1/fs;

sig = [chirp(t-1,0.1,17,2,'quadratic',1).*sin(2*pi*t/5);
    chirp(t-2,2,2,2.1,'quadratic',100).*exp(-(t-6.5).^2/20).*sin(2*pi*t*2);
    0.85*besselj(0,5*(sin(2*pi*(t+1.5).^2/20).^2)).*sin(2*pi*t/9)]';

sigsat = sig;
stv = 0.1;
sigsat(sigsat >= stv) = stv;

신호 분석기를 열고 원래 신호와 포화된 신호를 신호 테이블에 끌어서 놓습니다. 원래 채널과 포화된 채널을 각각의 디스플레이에 끌어서 놓습니다.

다항식을 사용하여 신호 피크를 복원하는 함수를 작성합니다.

  • 첫 번째 입력 인수 x는 입력 신호입니다. 이 인수는 벡터여야 하며 단일 채널로 처리됩니다.

  • 두 번째 입력 인수 tIn은 시간 값으로 구성된 벡터입니다. 이 벡터는 신호와 길이가 동일해야 합니다. 입력 신호에 시간 정보가 없는 경우 함수는 이 인수를 빈 배열로 읽어 들입니다.

  • varargin을 사용하여 추가 입력 인수를 지정합니다. 추가 입력 인수가 없는 경우 varargin을 생략할 수 있습니다. 추가 인수는 전처리 탭에서 쉼표로 구분되고 정렬된 목록으로 입력합니다.

  • 첫 번째 출력 인수 y는 전처리된 신호입니다.

  • 두 번째 출력 인수 tOut은 출력 시간 값으로 구성된 벡터입니다. 입력 신호에 시간 정보가 없는 경우 tOut은 빈 배열로 반환됩니다.

  • 자신만의 고유한 알고리즘을 구현하기 위해 MATLAB® 또는 Signal Processing Toolbox™ 함수를 사용할 수 있습니다.

function [y,tOut] = declip(x,tIn,varargin)
% Declip saturated signal by fitting a polynomial

    % Initialize the output signal

    y = x;

    % For signals with no time information, use sample numbers as abscissas
    
    if isempty(tIn)
        tOut = [];
        t = (1:length(x))';
    else
        t = tIn;
        tOut = t;
    end
    
    % Specify the degree of the polynomial as an optional input argument
    % and provide a default value of 4
    
    if nargin<3
        ndx = 4;
    else
        ndx = varargin{1};
    end

    % To implement your algorithm, you can use any MATLAB or Signal
    % Processing Toolbox function
    
    % Find the intervals where the signal is saturated and generate an 
    % array containing the interval endpoints
    idx = find(x==max(x)); 
    fir = [true;diff(idx)~=1];
    ide = [idx(fir) idx(fir([2:end 1]))];
    % For each interval, fit a polynomial of degree ndx over the ndx+1 points
    % before the interval and the ndx+1 points after the interval
    for k = 1:size(ide,1)
        bef = ide(k,1); aft = ide(k,2);
        intv = [bef-1+(-ndx:0) aft+1+(0:ndx)];
        [pp,~,mu] = polyfit(t(intv),x(intv),ndx);
        y(bef:aft) = polyval(pp,t(bef:aft),[],mu);
    end

end

함수를 신호 분석기에 사용자 지정 전처리 함수로 추가합니다. 분석기 탭에서 전처리 ▼를 클릭하고 사용자 지정 함수 추가를 선택합니다. 함수 이름과 설명을 입력합니다. 표시되는 편집기 창에 함수 텍스트를 붙여 넣습니다. 파일을 저장합니다. 전처리 갤러리에 함수가 표시됩니다.

생성된 함수가 포화 영역을 복원하는지 확인합니다.

  1. 신호 테이블에서 포화된 신호의 첫 번째 채널을 선택합니다.

  2. 분석기 탭에서 전처리 ▼를 클릭하고 declip을 선택합니다.

  3. 표시되는 전처리 탭에서 전처리를 클릭합니다.

신호에 시간 정보가 있는 경우 전처리 함수가 동작하는지 확인합니다.

  1. 신호 테이블에서 sigsigsat를 선택합니다. 개별 채널은 선택하지 마십시오.

  2. 분석기 탭에서 시간 값을 클릭하고 Sample Rate and Start Time을 선택한 다음, fs를 샘플 레이트로 지정합니다.

  3. 복원된 영역을 포함하는 상단 패널의 신호에 시간 정보가 포함되어 있습니다.

선택적 입력값을 지정할 때 함수가 동작하는지 확인합니다.

  1. 신호 테이블에서 포화된 신호의 두 번째 채널과 세 번째 채널을 선택합니다.

  2. 전처리 탭의 인수 필드에 8을 입력하고 전처리를 클릭합니다. 전처리 함수가 8차 다항식을 사용하여 포화 영역을 복원합니다.

신호 분석기를 사용하여 베어링 진동 신호의 포락선 스펙트럼을 계산하고 결함을 찾습니다. MATLAB® 스크립트와 함수를 생성하여 분석을 자동화합니다.

베어링 진동 데이터 생성하기

그림에 표시된 치수를 갖는 베어링이 초당 f0=25 사이클로 구동되고 있습니다. 가속도계가 10kHz로 베어링 진동을 샘플링합니다.

이 예제의 마지막에 나오는 bearingdata 함수를 사용하여 결함 있는 두 개의 베어링으로부터 진동 신호를 생성합니다. 하나의 신호 xBPFO에서는 베어링의 외륜에 결함이 있습니다. 다른 신호 xBPFI에서는 베어링의 내륜에 결함이 있습니다. 베어링 결함의 모델링 및 진단에 대한 자세한 내용은 회전 기계의 진동 해석 항목과 envspectrum을 참조하십시오.

[t,xBPFO,xBPFI,bpfi] = bearingdata;

신호 분석기를 사용하여 포락선 스펙트럼 계산하기

신호 분석기를 열고 BPFO 신호를 디스플레이로 끌어서 놓습니다. 신호 테이블에서 신호에 대한 시간 정보를 선택하고 분석기 탭에서 시간 값 버튼을 클릭하여 시간 정보를 추가합니다. Sample Rate and Start Time 옵션을 선택하고 샘플 레이트를 10kHz로 입력합니다.

표시 탭에서 스펙트럼을 클릭하여 스펙트럼 보기를 엽니다. 진동 신호의 스펙트럼을 통해 BPFO 고조파가 3kHz 충격 주파수로 인해 변조되었음을 알 수 있습니다. 스펙트럼의 아래쪽에서는 구동 주파수 및 주파수 차수로 인해 다른 특징들이 가려집니다.

신호를 선택하고, 분석기 탭에서 복제를 클릭하여 신호의 복사본을 생성합니다. 새 신호의 이름을 envspec로 지정하고 디스플레이로 끌어서 놓습니다. 힐베르트 변환을 사용하여 신호의 포락선 스펙트럼을 계산합니다.

  1. 신호의 DC 값을 제거합니다. 분석기 탭에서 전처리 ▼를 클릭하고 추세 제거를 선택합니다. 표시되는 추세 제거 탭에서 방법으로 Constant를 선택합니다. 추세 제거를 클릭합니다.

  2. 추세 제거된 신호를 대역통과 필터에 통과시킵니다. 분석기 탭에서 전처리 ▼를 클릭하고 대역통과를 선택합니다. 표시되는 대역통과 탭에서 하부 통과대역 주파수와 상부 통과대역 주파수를 각각 2250Hz와 3750Hz로 입력합니다. 대역통과를 클릭합니다.

  3. 필터링된 신호의 포락선을 계산합니다. 분석기 탭에서 전처리 ▼를 클릭하고 포락선을 선택합니다. 표시되는 포락선 탭에서 방법으로 Hilbert를 선택합니다. 포락선을 클릭합니다.

  4. 추세 제거를 사용하여 포락선의 DC 값을 제거합니다.

디스플레이의 스펙트럼 보기에 포락선 스펙트럼이 표시됩니다. 포락선 스펙트럼에 BPFO 고조파가 명확히 표시됩니다.

통합 분석 스크립트 생성 단계

포락선 스펙트럼의 계산을 여러 개의 베어링에 대해 반복해야 하는 경우 계산이 번거로울 수 있습니다. 신호 분석기를 사용하면 MATLAB® 스크립트와 함수를 생성하여 계산을 자동화할 수 있습니다.

이를 위한 예제로, 앞에서 수행한 분석을 BPFI 신호에 대해 반복해 보겠습니다. 신호 분석기는 자동화에 유용한 다음 두 가지 구성요소를 생성합니다.

  1. 신호를 추세 제거하고, 필터링하고, 포락선을 계산하여 전처리하는 함수

  2. 포락선 스펙트럼을 계산하는 스크립트

통합 분석 스크립트를 만들려면 전처리 함수와 플로팅 스크립트를 변경 없이 하나의 파일에 저장하십시오. (또는, 함수를 별도의 파일에 저장할 수도 있습니다.)

  • 스크립트와 함수를 하나의 MATLAB® 스크립트에 저장할 경우, 함수가 마지막에 와야 한다는 사실에 유의하십시오.

  • 각 함수의 끝부분에 키워드 end를 추가해야 합니다.

1. 전처리 함수 만들기

먼저 전처리 단계를 재현하는 함수를 만듭니다. envspec 신호를 선택합니다. 분석기 탭에서 함수 생성을 클릭합니다. 이 함수는 preprocess라는 디폴트 이름으로 편집기에 표시됩니다. 생성된 함수를 통합 분석 스크립트 끝부분에 저장합니다. 함수에는 시간 정보를 지정하는 두 번째 인수가 필요합니다. 함수를 사용하여 BPFI 신호를 전처리합니다.

envspec = preprocess(xBPFI,t);

2. 스펙트럼 스크립트 만들기

앱에서, 처리되지 않은 신호 이름 옆에 있는 체크박스 선택을 취소하여 디스플레이에서 제거합니다. 표시 탭에서 스크립트 생성 ▼을 클릭하고 Spectrum Script를 선택합니다. 편집기에 스크립트가 나타납니다. 생성된 코드를 통합 분석 스크립트에 포함합니다. 분석 스크립트를 실행하면, 생성된 스크립트가 전처리된 BPFI 신호의 포락선 스펙트럼을 계산합니다.

% Compute power spectrum

% Generated by MATLAB(R) 9.6 and Signal Processing Toolbox 8.2.
% Generated on: 12-Nov-2018 15:13:34

% Parameters
timeLimits = [0 0.9999]; % seconds
frequencyLimits = [0 5000]; % Hz

%%
% Index into signal time region of interest
envspec_ROI = envspec(:);
sampleRate = 10000; % Hz
startTime = 0; % seconds
minIdx = ceil(max((timeLimits(1)-startTime)*sampleRate,0))+1;
maxIdx = floor(min((timeLimits(2)-startTime)*sampleRate,length(envspec_ROI)-1))+1;
envspec_ROI = envspec_ROI(minIdx:maxIdx);

% Compute spectral estimate
% Run the function call below without output arguments to plot the results
[Penvspec_ROI, Fenvspec_ROI] = pspectrum(envspec_ROI,sampleRate, ...
    'FrequencyLimits',frequencyLimits);

3. 포락선 스펙트럼 플로팅하기

포락선 스펙트럼을 플로팅합니다. 피크 위치를 처음 10개 BPFI 고조파의 주파수와 비교합니다. 출력 인수 없이 pspectrum 명령을 사용하여 포락선 스펙트럼을 플로팅할 수도 있습니다.

plot(Fenvspec_ROI,(Penvspec_ROI))
hold on
[X,Y] = meshgrid((1:10)*bpfi,ylim);
plot(X,Y,':k')
hold off
xlim([0 10*bpfi])

함수 코드

신호 전처리 함수

앱에서 생성된 신호 전처리 함수에는 추세 제거, 대역통과 필터링 및 포락선 계산이 결합되어 있습니다.

function y = preprocess(x,tx)
%  Preprocess input x
%    This function expects an input vector x and a vector of time values
%    tx. tx is a numeric vector in units of seconds.

% Generated by MATLAB(R) 9.6 and Signal Processing Toolbox 8.2.
% Generated on: 12-Nov-2018 15:09:44

y = detrend(x,'constant');
Fs = 1/mean(diff(tx)); % Average sample rate
y = bandpass(y,[2250 3750],Fs,'Steepness',0.85,'StopbandAttenuation',60);
[y,~] = envelope(y);
y = detrend(y,'constant');
end

베어링 데이터 생성 함수

베어링의 피치 직경은 p=12cm이고 베어링 접촉각은 θ=0입니다. n=8개의 각 구름 요소는 지름이 d=2cm입니다. 내륜이 초당 f0=25 사이클로 구동되는 동안 외륜은 부동 상태로 유지됩니다. 가속도계가 10kHz로 베어링 진동을 샘플링합니다.

function [t,xBPFO,xBPFI,bpfi] = bearingdata

p = 0.12;
d = 0.02;
n = 8;
th = 0;
f0 = 25;
fs = 10000;

양호한 베어링을 만들기 위해 구동 주파수의 몇 차수에 해당하는 주파수들을 중첩해 진동 신호를 만들고 백색 가우스 잡음을 추가합니다.

t = 0:1/fs:1-1/fs;
z = [1 0.5 0.2 0.1 0.05]*sin(2*pi*f0*[1 2 3 4 5]'.*t);

xHealthy = z + randn(size(z))/10;

외륜의 결함으로 인해 일련의 5밀리초 길이의 충격이 발생하고 시간이 흐르면 베어링이 마모됩니다. 충격은 베어링의 외륜 통과 주파수(ball pass frequency outer race, BPFO)에서 발생합니다.

BPFO=12nf0[1-dpcosθ].

충격을 3kHz의 지수적으로 감쇠된 정현파로 구성된 주기적 열로 모델링합니다. 양호한 신호에 충격을 더하여 BPFO 진동 신호를 생성합니다.

bpfo = n*f0/2*(1-d/p*cos(th));

tmp = 0:1/fs:5e-3-1/fs;
xmp = sin(2*pi*3000*tmp).*exp(-1000*tmp);

xBPFO = xHealthy + pulstran(t,0:1/bpfo:1,xmp,fs)/4;

결함이 내륜에 있을 경우, 충격은 다음 주파수에서 발생합니다.

BPFI=12nf0[1+dpcosθ].

양호한 신호에 충격을 더하여 BPFI 진동 신호를 생성합니다.

bpfi = n*f0/2*(1+d/p*cos(th));

xBPFI = xHealthy + pulstran(t,0:1/bpfi:1,xmp,fs)/4;

end

관련 예제

프로그래밍 방식으로 사용

모두 확장

signalAnalyzer신호 분석기 앱을 엽니다.

signalAnalyzer(sig)신호 분석기 앱을 열고 신호 sig를 가져와 플로팅합니다. 앱이 이미 열려 있으면 이 함수는 현재 디스플레이에 sig를 플로팅합니다. 이미 플로팅된 sig가 변경되었다면 함수 호출 시 해당 플롯이 업데이트됩니다.

sig는 작업 공간의 변수이거나 MATLAB 표현식일 수 있습니다. sig는 다음일 수 있습니다.

  • 각 열이 독립 신호인 벡터 또는 행렬.

  • duration형으로 지정된 시간 값이 있는 timetable.

  • timeseries 객체.

자세한 내용은 Data Types Supported by Signal Analyzer 항목을 참조하십시오.

기본적으로 앱은 신호를 샘플 인덱스 함수로 플로팅합니다. 시간 정보를 제공하거나 신호에 내재된 시간 정보가 있는 경우 앱은 신호를 시간 함수로 플로팅합니다.

signalAnalyzer(sig1,...,sigN)은 N개의 신호 벡터 또는 행렬을 가져와서 현재 디스플레이에 플로팅합니다. 앱은 내재된 시간 정보가 있는 신호와 내재된 시간 정보가 없는 신호를 동일한 함수 호출에서 가져올 수 없습니다.

signalAnalyzer(___,'SampleRate',fs)는 샘플 레이트 fs를 양의 스칼라(단위: Hz)로 지정합니다. 앱은 시작 시간을 0으로 가정한 상태에서 샘플 레이트를 사용하여 시간에 대해 하나 이상의 신호를 플로팅합니다. 내재된 시간 정보가 없는 신호에 대해 샘플 레이트를 지정할 수 있습니다.

signalAnalyzer(___,'SampleTime',ts)는 샘플 시간 ts를 양의 스칼라(단위: 초)로 지정합니다. 앱은 시작 시간을 0으로 가정한 상태에서 샘플 시간을 사용하여 시간에 대해 하나 이상의 신호를 플로팅합니다. 내재된 시간 정보가 없는 신호에 대해 샘플 시간을 지정할 수 있습니다.

signalAnalyzer(___,'StartTime',st)는 신호 시작 시간 st를 스칼라(단위: 초)로 지정합니다. 샘플 레이트 또는 샘플 시간을 지정하지 않으면, 앱은 샘플 레이트를 1Hz로 가정합니다. 내재된 시간 정보가 없는 신호에 대한 시작 시간을 지정할 수 있습니다.

signalAnalyzer(___,'TimeValues',tv)는 데이터 점에 해당하는 시간 값을 갖는 벡터 tv를 지정합니다. tv는 초를 단위로 하는 값을 갖는 실수 숫자형 벡터일 수 있습니다. tvduration형 배열일 수도 있습니다. tv의 값은 고유해야 하고 NaN일 수 없지만 간격이 균일할 필요는 없습니다. 모든 입력 신호는 tv와 길이가 동일해야 합니다. 내재된 시간 정보가 없는 신호에 대해 시간 값으로 구성된 벡터를 지정할 수 있습니다.

불균일하게 샘플링된 신호는 필터링과 스케일로그램 보기에 사용할 수 없습니다.

R2016a에 개발됨