KR100772838B1 - 잡음 측정 검사 시스템 및 방법 - Google Patents

잡음 측정 검사 시스템 및 방법 Download PDF

Info

Publication number
KR100772838B1
KR100772838B1 KR1020017014649A KR20017014649A KR100772838B1 KR 100772838 B1 KR100772838 B1 KR 100772838B1 KR 1020017014649 A KR1020017014649 A KR 1020017014649A KR 20017014649 A KR20017014649 A KR 20017014649A KR 100772838 B1 KR100772838 B1 KR 100772838B1
Authority
KR
South Korea
Prior art keywords
int
low noise
break
case
mixer
Prior art date
Application number
KR1020017014649A
Other languages
English (en)
Other versions
KR20020044109A (ko
Inventor
유진 알지스키
Original Assignee
유진 알지스키
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by 유진 알지스키 filed Critical 유진 알지스키
Publication of KR20020044109A publication Critical patent/KR20020044109A/ko
Application granted granted Critical
Publication of KR100772838B1 publication Critical patent/KR100772838B1/ko

Links

Images

Classifications

    • GPHYSICS
    • G01MEASURING; TESTING
    • G01RMEASURING ELECTRIC VARIABLES; MEASURING MAGNETIC VARIABLES
    • G01R23/00Arrangements for measuring frequencies; Arrangements for analysing frequency spectra
    • G01R23/16Spectrum analysis; Fourier analysis
    • G01R23/20Measurement of non-linear distortion
    • GPHYSICS
    • G01MEASURING; TESTING
    • G01RMEASURING ELECTRIC VARIABLES; MEASURING MAGNETIC VARIABLES
    • G01R29/00Arrangements for measuring or indicating electric quantities not covered by groups G01R19/00 - G01R27/00
    • G01R29/26Measuring noise figure; Measuring signal-to-noise ratio

Landscapes

  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Nonlinear Science (AREA)
  • Mathematical Physics (AREA)
  • Testing Electric Properties And Detecting Electric Faults (AREA)
  • Monitoring And Testing Of Transmission In General (AREA)
  • Measurement Of Resistance Or Impedance (AREA)
  • Tests Of Electronic Circuits (AREA)
  • Testing Of Individual Semiconductor Devices (AREA)
  • Digital Transmission Methods That Use Modulated Carrier Waves (AREA)
  • Radar Systems Or Details Thereof (AREA)

Abstract

본원의 발명에 따른 잡음 측정 시험 시스템이 시험 유닛(UUT)의 위상잡음 측정을 하도록 제공된다. 상기 잡음 측정 시험 시스템은 가변 증폭기, 가변 저잡음 소스, 가변 위상 이동 장치, 믹서, 가변 저잡음 정합 증폭기, 아날로그-디지탈 변환기, 처리기 그리고 스펙트럼 분석 장치를 포함한다. 상기 저잡음 소스에 의해 발생된 첫 번째 저잡음 신호는 상기 시험 유닛 및 가변 증폭기를 통하여 믹서로 전달된다. 상기 저잡음 소스에 의해 발생되는 두 번째 저잡음 신호는 상기 가변 위상 이동 장치를 통하여 상기 믹서로 전달된다. 상기 믹서는 수신된 신호들을 90도의 위상차를 갖도록 하며 아날로그-디지탈 변환기를 통하여 상기 처리기 및 스펙트럼 분석 장치로 전달되는 한개의 측정 시험 신호를 출력시킨다. 상기 처리기는 제어 링크를 포함하여 상기 증폭기, 저잡음 소스 및 위상 이동 장치를 조정한다. 이에 따라, 상기 믹서에 의해 수신된 신호들이 90도의 위상차를 갖도록 한다. 상기 처리기는 또한 상기 저잡음 정합 증폭기를 제어하여 상기 믹서와 아날로그-디지탈 변환기 사이에 적절한 임피던스가 있도록 한다. 또한, 상기 측정 시험 신호가 적절한 잡음 시험을 위해 충분한 증폭을 가질 수 있도록 한다. 적절한 실시예에서 상기 처리기는 전체 시험 프로토콜을 통하여 상기 시험 시스템의 자동제어를 제공한다. 추가의 바람직한 실시예에서, 상기 잡음 측정 시험 시스템은 반송파 신호와 관련하여 진폭과 주파수가 변화하는 교정 신호들을 제공한다.

Description

잡음 측정 검사 시스템 및 방법{AUTOMATED FREQUENCY STEPPING NOISE MEASUREMENT TEST SYSTEM}
본 발명은 무선 주파수(RF) 신호에 존재하는 잡음을 측정하는 장치에 대한 것이다. 특히 본 발명은 RF 신호를 증폭하거나 수정하는 장치의 위상 잡음 및 주파수 잡음 측정을 하기위한 자동 측정 검사 시스템에 대한 것이다.
증폭기는 반송파 신호의 이득을 증가시키기 위한 장치이다. 증폭기는 오늘날 많은 전자 장치에서 중요한 역할을 맡고 있다. 이득, 평탄이득, 압축포인트, 상호변조와 같은 파라미터들은 증폭기의 성능을 최적화하는데 항상 중요하였다. 또한 증폭기의 새로운 파라미터들이 전체 시스템성능을 유지하기 위해 중요해지고 있다. 불행하게도 상기 반송파 신호를 증폭하는 것 이외도 증폭기는 상호 변조 그리고 열 잡음, 쇼트잡음 및 깜박임 잡음을 포함하는 측파대 잡음의 형태로 본래의 RF 신호에 RF 에너지를 대개 삽입시킨다. 이와 같은 잡음은 임의적이며 추가 및 잔류위상 잡음 및 주파수 잡음으로 불린다. 또한 의사 잡음신호가 증폭기에 의해 발생 될 수 있다. 이들은 전력선 그리고 진동 변조와 관련 될 수 있는 "스퍼(spurs)"라 불리는 컴포넌트들로 출현하는 신호들로 구성된다. 이와 같은 잡음은 가능한 최소이도록 함이 중요하다. 주파수 잡음이 위상 잡음과 함수관계를 갖기 때문에 이들 잡음 컴포넌트들은 위상잡음으로서 집합적으로 언급될 것이다.
RF 신호 소스에서 위상잡음이 존재함으로서 코드 분할다중접근(CDMA) 및 시분할다중접근(TDMA) 셀룰러(celluler) 통신시스템과 같은 아날로그, 디지털 통신과 관련된 응용을 포함하는 여러 응용에서 우려가 된다. 이동통신을 위한 유럽 글로벌 시스템(GSM)은 무선통신 시스템이 각 컴포넌트가 정확한 한도 내에서 동작하는 경우에만 올바로 동작하기 때문에 이동 및 기지국 송신기 모두를 위한 동작 요구 사항을 규정하는 상세한 기준을 공표하였다. 이동 송신기 및 기지국은 다른 사람에게 할당된 주파수 채널 및 타임 슬롯으로 과도한 파워를 송신하지 않으면서 통화 품질을 유지할 수 있도록, 충분한 파워, 충분한 충실도를 가진 RF 신호를 송신하여야 한다.
특히 통신장비의 경우, 이들 장비가 증폭기에 의해 발생된 신호의 증폭크기 이하로 나타나는 때에도 스퍼 및 왜곡 프로덕트를 최소하는 것이 중요하다. 이는 통신 시스템내의 여러 통신 모듈로부터의 왜곡 또는 잡음이 통계적으로 가산됨으로서 전체시스템으로 잡음의 크기를 높이기 때문이다. 따라서 상기 증폭기에 의해 발생된 신호 크기 이하인 경우에도 증폭기의 위상 잡음 수준을 측정하는 것이 이제 중요하게 되었다.
위상 잡음은 또한 특히 송신된 신호로부터의 회귀 에코(return echo)에 의해 발생된 주파수의 차이를 측정함으로서 이동표적의 속도를 결정하는 도플러 레이더 장비와 같은 레이더 장비에서 중요하다. 이러한 회귀 에코 신호는 측정을 위해 일반적으로 증폭된다. 불행하게도 40dB까지의 매우 큰 잡음플로어가 상기 반송파 주파수 가까이에서 관찰되어졌다. 상기 레이더 장비 증폭기에 의해 발생된 이와 같은 높은 백 그라운드 잡음은 표적 검출 민감도 질을 떨어뜨리게 되며 지상 및 공중 배치 레이더의 적절한 동작을 저해하도록 한다. 어떤 경우에는 상기 증폭기에 의해 발생된 위상 잡음의 발생시 부분적으로 또는 완전히 상기 에코 신호를 감추도록 하기까지 한다.
증폭기 위상 잡음을 측정하기 위한 가장 직접적이며 효율적인 기술은 알려진 주파수의 신호를 상기 증폭기에 입력시키고 그 출력을 스펙트럼 분석기에 연결시키는 것이다. 그러나 상기 반송파 신호의 주파수와 가까운 주파수를 가진 위상잡음을 측정하는 것이 어렵다. 또는 이와 같은 기술을 사용하여 상기 증폭기 출력신호의 진폭 이하인, 증폭기에 의해 야기되는 잡음을 측정하는 것은 불가능하다. 특정 시스템에 의해 발생된 잡음의 크기를 최소로 하기 위해서는 그와 같은 잡음을 측정할 수 있는 것이 매우 바람직하다. 결과적으로 위상잡음 측정을 할수 있는 장치에 대한 계속적인 필요가 있어 왔다.
RF 신호의 위상잡음 측정을 하기 위한 두 가지 접근 방법이 연구되고 있다. 첫 번째 장치는 도파관 지연선 판별장치를 사용하는 잡음 측정 검사 장치이다. 가령 Newberg 등에게 특허된 미국특허 제5,608,331호는 도파관, 동축 및 광섬유 지연성을 사용하여 마이크로파 신호의 위상잡음 및 진폭 잡음을 측정하기 위한 검사 시스템을 공표하고 있다. 상기 지연선 판별 장치는 시험 대상인 유닛으로부터의 RF 입력을 상용하여 위상 잡음 평가를 위해 상기 지연선을 통해 기준신호를 발생시키도록 한다. 시험중인 유닛으로부터의 신호는 첫번째 및 두 번째 경로로 나뉘어지고, 각 신호를 90도의 위상차를 갖도록 하는 믹서에서 다시 혼합된다. 상기 시험 시스템은 매우 낮은 잡음 또는 거의 없는 잡음을 발생시키며, 상기 믹서는 스위핑 스펙트럼에 의해 측정될 수 있는 복조된 위상 잡음을 출력시킨다.
위상 잡음 측정을 하기 위해 두 번째 종래의 접근 방법은 두 개의 위상 로크 RF소스로 부터의 잡음 결합을 사용한다. 낮은 잡음 소스가 제공되어 대개 증폭기와 같은 시험 대상의 유닛으로 반송파 신호를 제공한다. 상기 낮은 잡음 소스는 또한 믹서에서 증폭기로부터의 반송파 신호와 결합되는 반송파 신호와 같은 주파수의 두 번째 낮은 잡음 신호를 발생시키기도 한다. 위상 이동 장치를 사용하여, 상기 믹서는 두 개의 신호가 90도의 위상차를 주도록 만든다. 상기 시험에서 심각한 잡음이 없다고 가정할 때, 상기 믹서 출력신호는 시험중인 유닛의 잡음을 나타내며 이는 스위핑 스펙트럼 분석기(sweeping spectrum analyzer)에 의해 측정될 수 있다.
불행하게도 공지 기술의 시스템을 사용하여 변조 측정 및 광대역 잡음 측정을 하는 것은 비싸고, 곤란한 점이 있으며 시간 소모적이다.
600kHz와 같은 와이드 오프셋(wide offset)에서는 이와 같은 측정은 매우 값비싼 높은 동적 범위를 필요로 한다. 이와 같은 이유로 광대역 잡음측정은 샘플 형태로만 수행될 수 있을 뿐이다.
샘플 형태로 잡음측정을 수행하는 것도, 이와 같은 기술이 많은 시험 장비의 제조정을 필요로 하는 일련의 분리된 측정의 수행을 필요로 하기 때문에, 극도로 시간 소모적이다.
가령 상기에서 설명된 지연선 기술을 사용하는 경우 광대역에 걸쳐있는 여러 주파수 할당에서 위상 이동 장치, 감쇠장치 및 추가의 증폭기들을 조정하여야한다. 이와 유사하게 상기 설명된 초저(ultra low) 잡음 소스 시험 시스템은 광대역에 걸쳐있는 주파수 오프셋 각각에 대하여 저 잡음소스, 위상 이동 장치, 추가 증폭 장치들을 수동으로 조정할 것을 필요로 한다. 이들 유닛 각각에 대한 수동조정은 시험측정마다 10분 이상이 걸린다. 더구나 시험의 정확성을 확보하기 위해서는 많은 수의 시험 샘플들이 택해져야 하며, 샘플 측정 수가 증가함으로서 테스트되는 유닛의 잡음 측정 오류에 대한 표준 편차가 감소하게 된다. 결국, 테스트되는 유닛의 정확한 동작을 확인하기 위해 충분한 판독이 이루어져야 한다.
불행하게도 이같은 시험을 수행하는 것은 매우 비싸며 시간 소모적이다. 또한 공지기술 시험 시스템은 $100,000에서 $200,000에 이를 정도로 매우 비싸다. 또한 이들 시스템들은 낱개 구매가 되어야 하며 바람직한 시험장 시스템을 만들기 위해 조립되어야 하는 증폭기, 저잡음 소스, 신호감쇠기, 위상 이동 장치, 믹서 및 스위핑 잡음 분석 장치를 따로따로 구매할 것을 필요로 한다. 이들 컴포넌트 각각의 상호 연결은 상기 시스템으로 위상잡음 발생의 또 다른 여지를 만들게 된다.
따라서 저-수준 위상잡음을 정확하게 측정할 수 있는 잡음측정 시험시스템이 요구되어 왔다.
잡음 측정 시험시스템이 시험측정시 높은 수준의 재현성을 가질 수 있다면 바람직할 것이다. 이를 위해, 만약 잡음 측정 단가를 위해 반드시 조정되어야 하는 증폭기, 위상 이동 장치, 감쇠기, 저잡음소스등을 포함하는 시험시스템의 각기 다른 컴포넌트들을 수동으로 조작하여야 하는 필요성을 제거한 잡음 측정 시험시스템이 제공될 수 있다면, 이는 더욱 바람직 할 것이다.
잡음 측정시험 시스템이 경량이며 작은 크기를 갖게 되는 단일의 모듈러 컴 포넌트로 제공될 수 있다면 이는 또한 더욱 바람직 할 것이다.
본 발명에 따라, 유닛의 위상 잡음을 자동으로 시험하기 위한 개선된 장치 및 방법이 제공된다. 본 발명은 반송파 신호의 잡음신호 이하에서도 증폭기의 위상잡음을 검사하는 데 특히 적합하다. 본 잡음 측정 시스템은 조정가능한 저 잡음 신호를 발생시키기 위한 가변 저잡음 소스를 포함한다. 상기 가변 저잡음 소스는 동일한 저잡음 신호들을 출력시키기 위한 두 개의 출력을 포함하거나, 한개의 저잡음 신호를 두 개의 동일한 저잡음 소스 신호들로 분리시키기 위해 분리기에 결합된다. 상기 첫 번째 저잡음 신호는 시험 유닛(UUT)으로 보내진다. 상기 시험 유닛은 첫 번째 저잡음 반송파 신호를 수신하기 위한 한개의 입력과, 반송파 신호를 출력시키기 위한 한개의 출력을 포함한다. 상기 UUT 반송파 신호는 가변증폭기를 통해 보내지며 믹서에 의해 수신된다(UUT: Unit Under Test - 테스트받는 유닛, 즉, '시험 유닛').
상기 가변 저잡음 소스로부터 출력되는 두 번째 저잡음 신호가 가변 위상 이동 장치로 보내지며 상기 가변 위상 이동 장치는 상기 가변 증폭기를 통과하는 UUT 신호와 90도의 위상차를 갖도록 상기 두 번째 저잡음 신호를 조정한다. 위상이 이동되어진 후에, 상기 두 번째 저잡음 신호는 두 번째 입력 포트에서 믹서에 의해 수신되며, 여기서 이 신호는 상기 UUT 신호와 결합되고 한개의 믹서 출력 포트로부터 출력된다. UUT 신호와 두 번째 잡음신호가 서로 90도의 위상차 및 동일 진폭을 가지도록 상기 가변 증폭기 및 가변위상 이동 장치가 조정되어, 상기 시스템 또는 UUT에서 어떠한 잡음도 없다면 직류(DC)가 상기 믹서 출력 포트로부터 출력 되도록 한다. 그러나 상기 UUT에서 잡음이 있으며 시험 시스템 내에 매우 낮은 잡음이 있다고 가정하면, 상기 믹서는 시험 유닛의 잡음을 나타내는 신호를 출력시킨다. 그후, "측정 시험 신호"로 언급되는 상기 믹서로부터의 신호 출력이 가변 저잡음 정합 증폭기로 보내진다. 상기 가변 저잡음 정합 증폭기는 상기 측정시험 신호를 증폭하며 버퍼로서 작용한다. 이러한 정합 가변 측정기는 매우 낮은 잡음을 추가하도록 구성되어 상기 시험 유닛의 자동 측정을 간섭하지 않도록 하며, 상기 측정 시험 신호를 증폭시켜 상기 유닛내에서 어떠한 잡음도 측정할 수 있도록 하는 능력을 향상시키도록 한다.
상기 저잡음 정합 증폭기를 통과한 후에 상기 측정 시험 신호는 아날로그-디지탈 변환기(ADC)에서 수신되어 상기 아날로그 측정 시험 신호를 디지털 데이터로 변환시킨다. 다음에 상기 디지털 데이터가 상기 측정 시험 신호를 스펙트럼 분석기로 보내기 전에 평가할 수 있도록 처리기로 보내진다. 상기 스펙트럼 분석기는 고속, 또는 이산 푸리에 변환(fast or discrete fourier transform)을 이용하여, 측정 시험 신호의 잡음 스펙트럼을 정확히 측정한다. 이들 푸리에 변환은 당해 기술분야에 잘 알려져 있으며 따라서 본 명세서에서는 상세히 설명되지 않는다.
상기 처리기는 다수의 제어선에 의해 가변증폭기, 가변저잡음 소스, 가변 위상 이동 장치 및 가변 저잡음 정합 증폭기에 연결된다. 상기 처리기는 크기를 설정하고, 상기 증폭기, 저잡음 소스, 위상 이동 장치 및 정합 증폭기에 대한 조정을 행하여, 초기 교정을 구현하고 시험 유닛의 위상잡음 측정을 위한 최적 시스템 감도를 유지하도록 한다. 상기 처리기는 이들 자동제어 기능을 수행하여, 종래 수동으로 조작 되었던 상기 가변 저잡음 소스, 증폭기, 위상 이동 장치 및 정합 증폭기를 조정하도록 한다. 가령 시험 유닛의 잡음을 측정하기 위해서는 시험 유닛의 여러 시험 측정이 이루어져야 하며, 상기 저잡음 소스는 각기 다른 오프셋 주파수의 반송파 신호를 발생시키게 된다. 종래 기술 시스템은 먼저 저잡음 소스가 수동으로 조정될 것을 필요로 한다. 그후 상기 위상 이동 장치가 수동으로 조정되어 상기 믹서에 의해 수신된 신호가 90도 위상 차를 가질 수 있도록 한다. 상기 증폭기는 또한 상기 믹서에 의해 수신된 신호들이 동일한 진폭을 가지도록 조정되어야 한다. 더욱이 상기 정합 증폭기는 상기 믹서와 아날로그-다지탈 변환기 사이의 적정한 인피던스를 확보하도록 조정되어야 한다. 이들 수동조정은 10분 이상이 걸린다. 본발명의 처리기는 1분이하에 수행될 수 있는 이들 컴포넌트들의 자동 조정을 제공한다. 또한 본발명의 처리기는 전체 시험 프로그램이나 프로토콜의 생성 및 자동화를 제공한다. 시험 유닛의 각기 다른 저잡음 소스 오프셋의 주파수로 UUT의 다수 시험측정을 수행하기 위해 상기 시험시스템을 사전 프로그래밍 함으로서 일정 대역폭에서 시험될 수 있으며 단계화될 수 있다. 또한 상기 처리기는 사전 프로그램되어 각 주파수 오프셋에서 충분한 수의 시험 샘플들을 검사하여, 상기 시험유닛의 잡음 크기가 허용될 수 있는 수준내에 이를 수 있도록 한다.
측정 시험 시스템을 제어하기 위해, 상기 신호 처리기는 상기 ADC로부터의 디지탈 출력을 시스템의 눈금조정을 행하고 증폭기, 저잡음 소스 및 위상 이동 장치가 올바른 크기로 설정될 수 있도록 한다. 특히 상기 ADC로부터의 출력은 상기처리기가 상기 저잡음 소스가 올바른 주파수의 반송파 신호를 제공할 수 있는가를 결정할 수 있도록 한다. 상기 ADC로 부터의 출력을 평가함으로서, 상기 위상 이동 장치가 상기 믹서에 의해 수신된 신호들을 90도 위상차로 적절히 유지하고 있음을 상기 처리기가 결정할 수 있다. 이와 마찬가지로, 상기 믹서에 수신된 상기 UUT 신호의 적절한 크기의 증폭을 상기 가변 증폭기가 유지시키지 못하고 있다면, 상기 처리기가 이를 조정할 수 있다. 상기 컴포넌트들중 어느 것이 최적상태로 작용하지 않게 되면, 상기 처리기는 필요한 교정을 하여 상기 측정 시험신호에 의한 시험 유닛의 적절한 잡음 검사를 확보 할 수 있도록한다.
바람직한 실시에 의해서 본발명의 가변 저잡음 소스는 가변 반송파 신호 및 가변 교정 신호 모두를 출력시킨다. 상기 교정 신호는 반송파 신호의 진폭보다 약 60dB낮은, 반송파 신호 크기에 대해 정확하게 알려진 크기를 가지는 매우 낮은 크기의 잡음 측파대이다. 이 같은 교정 신호는 믹서내의 90도 위상차에 의해 제거되지 않으며, 따라서 상기 스펙트럼 분석기 상에서 나타난다. 상기 교정신호는 알려진 크기를 가지고 있기 때문에 상기 위상 잡음의 크기가 상기 교정신호의 표시된 크기와 비교 될 수 있다. 상기 시험 유닛에 의해 발생된 어떠한 잡음도 교정 신호와 비교되어 상기 시험 유닛의 위상 잡음을 정량적으로 측정할 수 있도록 한다.
또한 본 발명은 상기 교정신호의 크기를 조정함으로서 여러 수준에서 시스템을 양쪽으로 교정 할 수 있도록 한다. 특히 상기 측정 시스템이 교정되는 때 교정 신호는 각기 다른 크기가 시차적으로 제공되는 것이 바람직하다. 가령 상기 교정 신호는 먼저 상기 반송파 신호보다 10dB 작게 제공된다. 그 다음에 상기 교정신호가 상기 반송파 신호보다 20dB, 30dB, 40dB, 50dB 그리고 60dB 작은 크기를 갖도록 제공된다. 다음에 상기 처리기가 상기 스펙트럼 분석기에서 이들 교정 크기 각각을 디스플레이하여, 상기 시험 유닛에 의해 발생된 실제 위상 잡음을 결정할 때 더욱더 정확한 측정을 제공 할 수 있도록 한다.
또 다른 바람직한 예에서, 상기처리기는 상기 시험 시스템 교정 과정 중에 주파수가 오프셋 된 여러 교정 신호들을 발생시키기 위해 상기 가변의 저잡음 소스를 조정한다. 다시 말해서 본 발명은 상기 시스템이 교정될 때마다 시스템의 주파수 및 진폭을 교정할 수 있다. 가령, 상기 반송파 신호보다 10dB 내지 60dB 작은 교정 신호를 생성함으로서 시스템을 교정함에 추가하여, 상기 교정중에 상기 저잡음 소스는 상기 반송파 신호와 대비하여 주파수가 오프셋된 추가의 여러 교정신호들을 발생시킨다. 그후 상기 처리기는 상기 스펙트럼 분석기 상에 이들 교정 크기 각각을 나타내어 상기 시험 유닛에 의해 발생된 스퍼 또는 왜곡 프로덕트의 실제 주파수를 결정함에 있어서 더욱 보다 정확한 측정을 제공할 수 있도록 한다. 이같은 정보는 상기 시험 유닛에 의해 발생된 잡음의 어떠한 실제 원인도 결정하는 데 유용하게 사용될 수 있다.
따라서 본 발명에 목적은 시험 유닛의 RF 잡음을 측정하기 위한 개선된 자동 측정 검사 시스템을 제공하는 것이다.
본발명의 또 다른 목적은 1분이하에 달성될 수 있는 시스템 컴포넌트의 자동 조정을 제공하는 자동 측정 시험 시스템을 제공하는 것이다. 또한 본 발명의 목적은 요구에 따라 완전히 자동화된 시험 프로그램을 실시할 수 있는 자동잡음 측정 시험 시스템을 제공하는 것이다.
본 발명의 또 다른 목적은 상기 시스템이 교정될 때마다 반송파 신호에 대해 수 dB 단위로, 그리고, 상기 반송파 신호와 대비해서 수 오프셋 주파수 단위로 시스템을 교정할 수 있는 자동잡음 측정 시험 시스템을 제공하는 것이다. 하기에서는 첨부 도면을 참조하여 본 발명을 상세히 설명한다.
도 1 은 본 발명에 따른 자동잡음 측정 시험 시스템을 도시한 도면.
도 2a-2f 는 반송파 신호와 대비하여 각기 다른 dB 크기로 조정된 조정신호을 가지는 본발명의 저잡음 신호 소스에 의해 발생된 교정신호 및 반송파 신호를 도시하는 스펙트럼 분석기 상에서 도시된바의 그래프를 도시한 도면.
도 3a-3f 는 반송파 신호와 대비하여 여러 오프셋 주파수에서 시스템을 교정하도록 상기 교정신호가 조정되는 본발명의 저잡음 소스에 의해 발생된 교정신호 및 반송파 신호를 도시한 스펙트럼 분석기 상에 도시된바의 그래프를 도시한 도면.
도 4 는 본발명의 저잡음 소스에 의해 발생된 교정 신호와 비교하여 시험유닛의 측정 시험 신호를 도시하는 스펙트럼 분석기 상에 도시된 바의 그래프를 도시한 도면.
본 발명은 여러 가지 형태로 실시 될 수 있으나 하기에서는 본발명의 바람직한 실시예에 대하여 설명이 제공되며 명세서에 의하여 본발명의 한 예를 설명하는 것에 불과하고 특정한 예로 본발명을 제한하고자 아님을 이해하여야 한다.
도1에서, 본발명은 시험 유닛(3)에 의하여 반송파 신호(39)에 추가된 잡음을 측정하기 위한 개선된 잡음 측정시스템(1)을 제공한다. 상기 시험 유닛(3)은 출력포트(7)를 통하여 상기 잡음 측정 시스템으로부터 송신된 저잡음 반송파 신호(39)를 수신하기 위한 한개의 입력(4)을 포함한다. 상기 시험 유닛(3)은 상기 반송파 신호(3)를 변조하고, 증폭하거나 조정하며 한개의 출력포트(5)로부터 UUT신호(35)를 출력시킨다. 상기 UUT 신호(35)는 측정시험 시스템 출력포트(6)에 의해 수신되며 여기서 한개의 입력포트(17)와 한개의 출력포트(19)를 갖는 가변증폭기(15)를 통해 보내진다. 상기 가변 증폭기(15)를 통하여 보내진 뒤에, 상기 UUT 신호(35)는 첫 번째 믹서 입력(23)을 통해 믹서(21)에 의해 수신된다.
본발명의 상기 잡음측정 시험 시스템(1)은 상기 시험 유닛으로 제공된 저잡음 반송파 신호(39)를 발생시키는 가변 저잡음 소스(9)를 더욱더 포함한다. 상기 저잡음 소스는 또한 상기 반송파 신호(39)에서와 같은 주파수를 가지는 두 번째 저잡음 신호(37)를 제공하며 이신호는 출력포트(13)을 통해 제공된다. 다음에 상기 두 번째 저잡음 신호(37)가 한개의 입력포트(31)를 통하여 가변위상 이동 장치(29)로 보내지며 여기서 그 위상이 조정되고 상기 위상 이동 장치의 출력포트(33)를 통해 출력된다. 상기 가변 이동 장치(29)에 의해 위상이 조정되어진 후에, 상기 두 번째 저잡음 신호(37)는 입력포트(25)을 통하여 믹서(21)로 보내진다.
동작시에, 상기 가변위상 이동 장치(29)는 상기 두 번째 저잡음 신호(37)의 위상을 조정하여, 믹서(21)에 의해 수신될 때 상기 UUT 신호(35)와 90도의 위상차를 가질 수 있도록 한다. 또한, 상기 가변 증폭기(15)는 상기 UUT 신호(35)를 증폭하도록 조정될 수 있어서 믹서(21)에 의해 수신되는 때 상기 두 번째 저잡음 신호(37)의 진폭과 정합하는 진폭을 가질수 있도록 한다. 상기 믹서(21)는 상기 UUT 신호(35)와 상기 두 번째 저잡음 신호(37)를 결합하여 상기 신호들이 90도의 위상차를 가질 수 있도록 한다. 상기 가변 증폭기(15), 가변저잡음 소스(9), 가변 위상 이동 장치(29) 및 믹서(21)의 잡음이 무시할 수 있는 수준이라고 가정하면, 측정 시험 신호로 불리는 출력신호는 시험 유닛(3)의 잡음을 나타낸다. 이 같은 측정시험 신호(41)는 다음에 저잡음 정합 증폭기(43)의 입력(45) 및 출력(47)을 통과한다. 상기 저잡음 정합 증폭기(43)는 상기 측정시험 신호(41)의 진폭을 증폭하여 상기 시험 신호내에 어떠한 잡음도 더욱 용이하게 측정 될 수 있도록 한다. 또한 상기 저잡음 정합 증폭기(43)는 버퍼로서 작용하여, 상기 임피던스가 믹서(21)와 아날로그-디지탈 변환기(49) 사이에서 최적으로 유지될 수 있도록 보장한다. 이때, 상기 아날로그-디지탈 변환기(49)는 상기 저잡음 정합 증폭기(43)를 통해 측정시험 신호(41)를 수신하게 된다.
상기 아날로그-디지탈 변환기(49)는 한개의 입력포트(51)을 가져서 상기 측정시험 신호(41)를 수신할 수 있도록 한다. 상기 아날로그-디지탈 변환기(49)에 의해 수신 되어진 후에, 상기 측정 시험 신호(41)는 선입-선출 방식으로 디지털 포맷으로 변환되어 출력포트(53)를 통하여 출력된다. 이제 디지털 포맷으로 되어 있는 상기 측정시험 신호(41)는 입력포트(57)를 통하여 처리기(55)로 보내진다. 상기 처리기(55)는 상기 측정 시험 신호(41)의 여러 평가 작업을 수행하며, 이 신호를 일반적으로 변경없이, 한개의 출력포트(59)를 통해, 한개의 입력포트(63)를 가진 스펙트럼 분석기(61)로 보낸다. 상기 스펙트럼 분석기(61)는 상기 측정 시험(41)의 사진적 묘사를 제공하기 위한 비디오 표시장치를 포함한다.
본 발명의 상기 잡음 측정 시험 시스템(1)은 또한 상기 처리기(55)를 상기 가변 위상 이동 장치(29), 가변 증폭기(15), 가변 저잡음 소스(9), 및 가변 저잡음 정합 증폭기 각각으로 연결시키는 다수의 제어선(65,67,69 및 71)을 포함하기도 한다. 상기 처리기(55)는 상기 시험 시스템 오퍼레이터에 의해 결정된 시험 수준(test levels)을 설정하며, 증폭기(15), 저잡음 소스(9), 위상 이동 장치(29) 및 저잡음 정합 증폭기 (4(3))에 대하여 조정을 행하여, 시스템의 초기 교정을 행하고 시험 유닛(3)의 위상 잡음 측정을 위한 시스템의 최적 감도를 유지한다. 가령, 시험 유닛(3)의 위상 잡음을 측정하기 위하여, 상기 시험 유닛(3)의 위상 잡음에 대한 여러번의 측정이 있게 되어, 이때, 저잡음 소스가 서로 다른 여러 오프셋 주파수에서 반송파 신호를 발생하게 된다.
시험 유닛(3)에 대한 시험 프로토콜은 먼저 전체 시스템의 교정을 필요로 한다. 이에 따라, 상기 잡음 측정 시험 시스템(1)이 상기 시험 유닛(3)에 의해 발생된 위상 잡음을 정확하게 정량화함을 보장할 수 있다. 또한, 상기 잡음 측정 시험 시스템(1)이 상기 시험 설정 자체만으로 부적절한 수준의 잡음을 수반하지 않음을 보장할 수 있다. 도2 및 3과 관련하여, 바람직한 실시예에서는, 처리기(55)가 가변 반송파 신호(75) 및 가변 교정신호(77) 모두를 발생시키기 위해 상기 가변잡음 소스(9)를 조정한다. 상기 교정신호(77)는 상기 반송파 신호(75)에 대해 정확히 알려진 주파수 및 크기를 가지는 매우 낮은 잡음 측파대를 가진다. 전형적인 교정 신호(77)는 반송파 신호 자체의 크기보다 약 60dB 작은 크기를 가질 수 있다. 도 4에서 도시된 바와 같이, 상기 교정신호(77)가 알려진 크기를 가지기 때문에, 상기 측정 시험신호(79)의 어떠한 위상잡음의 디스플레이된 크기(높이)도 상기 교정신호(77)의 디스플레이된 크기(높이)와 비교될 수 있고, 따라서, 시험 유닛(3)의 위상잡음에 대한 정량적 측정을 제공할 수 있게 된다.
또다른 바람직한 실시예에서, 상기 교정 처리는 각기 다른 크기 수준을 갖는 여러 교정 신호(77)을 사용한다. 가령 도2a-2f에서, 교정신호(77)는 각기 다른 크기로 순차적으로 제공되어, 본 발명의 잡음 측정 시험 시스템(1)을 더욱 잘 교정할 수 있도록 한다. 가령 도2a-2f에 도시된바와 같이, 교정신호(77)는 먼저 -60dB로 제공된다. 도2b-2f와 관련하여서, 그후 반송파 신호(75)가 순차적으로 -50dB, -40dB, -30dB, -20dB 및 -10dB 크기로 제공된다. 도 4에서 도시된 바와 같이 이들 크기는 다음에 상기 스펙트럼 분석기(61)에서 표시될 수 있어서, 상기 시험 오퍼레이터가 비디오 표시장치에 도시된 어떠한 의심스런 프로덕트 또는 잡음 변동도 더욱 정확하게 측정할 수 있도록 한다.
또다른 바람직한 실시예에서, 처리기(55)는 상기 가변 저잡음 소스(9)를 제어하여, 본발명의 자동측정 시험 시스템(1)의 초기 교정을 수행할 때 주파수가 오프셋 된 다수의 교정 신호 (77)를 발생시키게 한다. 도 3a-3f와 관련하여서, 세 개의 교정신호(77)가 상기 반송파 신호(75)보다 낮은 주파수로 제공되며, 세 개의 교정신호(77)는 상기 반송파 신호(75)보다 높은 주파수로 제공된다. 상기 교정 신호의 크기가 알려진 때에는, 다음에 이들 값들이 상기 스펙트럼 분석기(61)에서 도식적으로 표시될 수 있어서 시험 유닛(3)에 의해 발생된 스퍼 또는 왜곡 프로덕트의 실제 주파수를 결정할 때에 더욱 정확한 측정을 제공할 수 있도록 한다. 상기 처리기(55)는 오퍼레이터가 상기 가변 증폭기(15), 저잡음 소스(9), 위상 이동 장치(29) 또는 저잡음 정합 증폭기(43)를 수동으로 조정할 필요없이 시험 시스템을 자동으로 조정할 수 있도록 한다.
전형적인 잡음 측정 시스템은 증폭기(15), 저잡음 소스(9), 위상 이동 장치(29) 및 저잡음 정합 증폭기 (43)의 수동조정을 필요로 한다. 다시 도 1과 관련하여서, 본발명의 잡음 측정 시험 시스템(1)은 이들 컴포넌트들의 자동 제어를 제공한다. 일단 교정이 되면, 상기 잡음 측정 시험 시스템(1)은 키보드등을 통하여 시험 오퍼레이터에 의해 제공된 지시에 따라 시험 프로토콜을 시작한다. 시험 오퍼레이터로부터의 지시는 상기 시험 유닛(3)이 시험될 주파수 대역폭, 시험을 위해 필요한 오프셋 주파수, 상기 오프셋 주파수의 간격, 그리고 오프셋 주파수 각각에서 수행되어야 하는 샘플의 수를 포함 할 것이다. 이 같은 시험 프로그램에 따라 처리기(55)는 제어 링크(69)를 통하여 상기 저잡음 소스(9)를 자동으로 조정함으로서 정해진 주파수에서 반송파 신호(39)를 발생 시킬수 있도록 한다. 상기에서 설명된 바와 같이 상가 반송파 신호(39)는 상기 시험 유닛(3)에 공급되며, 이때, 증폭기(15)를 통하여 믹서(21)에 전달되는 UUT 신호(35)가 상기 시험 유닛(30)에서 발생된다. 한편 상기 저잡음 소스(9)는 믹서(21)에 도달하기 전에 위상 이동 장치(29)를 통과하는 두 번째 저잡음 신호(39)를 발생시킨다. 상기 믹서는 상기 아날로그-디지탈 변환기(49)를 통하여 처리기(55)로 전달되는 상기 측정 시험 신호(41)를 출력시킨다. 상기 처리기(55)는 제어 링크(67)를 통하여 증폭기(15)를 자동으로 조정하여, 상기 UUT 신호(35)의 진폭이 입력포트(25)를 통해 믹서(21)에 의해 수신되는 두 번째 저잡음 신호(3)7의 진폭과 같아지도록 한다. 상기 처리기(55)는 또한 제어 링크(65)를 통하여 상기 위상 이동 장치(29)를 자동으로 조정하여 상기 두 번째 저잡음 신호(37)의 위상을 조정하도록 하고, 따라서 상기 UUT 신호(35)와는 90도 위상차를 가지도록하고, 상기 신호들이 믹서(21)에서 90도의 위상차를 갖도록 한다. 이와 같은 조정은 측정시험 신호(41)가 처리기(55)에 도달할 때 측정 시험신호(41)의 평가에 기초하여 이루어진다. 상기 저잡음 소스(9), 증폭기(15), 또는 위상 이동 장치(29)가 올바르게 조정되지 않을 경우, 처리기(55)가 제어링크를 통하여 상기 위상 이동 장치(29), 증폭기(15) 또는 저잡음 소스(9)에 어떠한 필요한 조정을 하도록하는 명령을 자동적으로 전송하여, 상기 측정 시험 시스템이 최적의 상태로 동작할 수 있도록 한다. 이와 같은 조정은 오퍼레이터의 조작을 필요로 하지 않는다. 믹서(21)을 떠난뒤에는, 상기 측정 시험 신호(41)가 상기 저잡음 정합 증폭기(43) 및 아날로그-디지탈 변환기(49)를 통해 처리기(55)로 전달된다. 믹서(21)와 아날로그-디지탈 변환기(49) 사이에 적절치 않은 임피던스가 있게되는 때에는, 처리기(55)는 상기 저잡음 정합 증폭기(43)를 자동으로 조정하여 적절한 임피던스가 발생될 수 있도록 한다. 이와 유사하게 상기 측정 시험 신호(41)가 적절한 잡음 측정을 하기에 불충분한 신호 세기를 가지는 경우엔, 상기 처리기(55)가 제어 링크(71)를 통해 저잡음 정합 증폭기(43)에 명령을 전송하여, 측정 시험 신호(41)의 이득을 증폭시키도록 저잡음 정합 증폭기(43)에 지시할 수 있다. 이와 같이, 본발명의 상기 잡음 측정 시험 시스템은 완전히 자동화된 시험 시스템을 제공한다.
처리기(55)에 도달한 후, 상기 측정시험 신호(41)가 상기 스펙트럼 분석기(61)로 전달된다. 이제 상기 아날로그-디지탈 변환기 (49)에 의해 디지털 포맷으로 변환된 상기 측정 시험 신호(41)는, 도 4에 도시된 바와 같이 상기 측정시험 신호(41)의 상기 잡음 스펙트럼을 정확하게 측정하는 이산 푸리에 변환(discrete Fourier Trnasformation)을 사용하여 상기 스펙트럼 분석기(61)에 의해 분석된다. 상기에서 설명된 바와 같이 상기 측정 시험 신호(41)는 DC 신호 또는 제로 신호로 등록될 것이며, 이때, 시스템 또는 시험유닛(3)에서 어떠한 잡음도 없게된다. 그러나 상기 시험 유닛에 의해 잡음이 발생되는 때에는, 상기 측정시험 신호(41)가 스펙트럼 분석기(61)에 교류(AC)로 나타날 것이며, 이때, 그 변화, 즉, 지터(jitter)는 상기 시험 유닛에 발생된 잡음을 나타낸다. 공지 기술분야에서 잘 알려진 바와 같이 1kHz의 위상잡음이 있게 되면, 다음의 식에 따라 1kHz에서 스위핑 분석장치(sweeping analyzer)에 스파이크가 표시될 것이다.
Figure 112006092928628-pct00001

이때, ΔV(t)는 시간에 따른 전압 변화이며, ΔΦ는 위상의 변화이다.
상기 결과는 상기 믹서출력(27)과 시험유닛의 위상요동 간에 선형 관계가 있기 때문이다. 이는 다음의 식에 의해 표시 될 수 있다.
Figure 112006092928628-pct00002

이때, KΦ는 해당 위상에서의 믹서의 이득 상수이다.
믹서(21)가 위상 검출기로 사용될 때 상기 믹서의 전압출력은 시험 유닛(3)의 위상요동에 직접 비례한다. 가령 1kHz의 위상 요동은 다음 식에 따라 스펙트럼 분석장치에서 1kHz의 비례 증폭 주파수로서 나타날 수 있다.
Figure 112001029844057-pct00003
Figure 112006092928628-pct00004

이때, fm이란 frequency measured의 약자로서, 측정된 주파수를 의미한다.
이와 유사하게 스펙트럼 분석장치(61)에서 측정된 주파수의 함수로서, 믹서(21)의 출력전압은 다음식에 따라 입력신호 위상 변화에 직접 비례하게 될 것이다.
Figure 112001029844057-pct00005
Figure 112001029844057-pct00006
Figure 112001029844057-pct00007
(measured phase detector consultant)
Figure 112001029844057-pct00008
Figure 112001029844057-pct00009
마찬가지로, 위상요동이 크면 클수록, 상기 스펙트럼 분석장치 표시기에는 잡음신호의 진폭이 더욱 크게 나타날 것이다. 또한 상기 잡음 측정 시스템의 해상도 대역폭을 변경시킴으로서 잡음 관련 요동으로부터 진정한 스퍼(spur)를 구분할 수 있다. 스퍼는 상기 해상도 대역폭이 변경될 때 일정한 진폭을 유지할 것이다. 이와는 반대로, 상기 해상도 대역폭이 변경될 때 잡음 관련 요동의 진폭은 변경될 것이다.
가령, 상기 시험유닛을 통해 일정한 수의 샘플 신호들을 통과시킴으로서, 상기 설명된 시험유닛(3)의 잡음에 대한 평가가 일정한 주파수에서 완료되면, 상기 처리기(55)는 각각 다른 오프셋 수준으로 상기 저잡음 소스(9)의 주파수를 자동으로 조정한다(즉, 스테핑한다). 상기 증폭기(15) 및 위상 이동 장치(29)는 상기 처리기(55)에 의해 또한 자동으로 조정되어, 믹서(21)에 의해 수신된 신호들을 90도 위상차로 유지시키며, 상기 저잡음 정합 증폭기(43)는 자동으로 조정되어 상기 믹서(21)와 아날로그-디지탈 변환기(49) 간에 충분한 신호이득 및 적절한 임피던스를 보장한다. 그후, 상기 측정 시험 신호(41)의 추가 평가가 새로운 오프셋 주파수에서 상기 스펙트럼 분석 장치(61)에 의해 수행된다. 스퍼 또는 잡음관련 요동이 특정 오프셋 주파수들에서 나타나기 때문에, 시험은 관심 대역 내에서 조밀하게 이격되는 주파수 별로 단계적으로 실시(스테핑 방식)되는 것이 바람직하다.
상기 시험 유닛(3)이 가변 증폭기(15)일 때, 상기 시험 유닛(3)은 특정이득 크기의 스퍼 또는 잡음 요동을 발생시킬 수 있다. 따라서 바람직한 실시예에서, 상기 잡음 측정시험 시스템(1)은 상기 처리기(55)를 시험 유닛(3)에 연결하는 추가적인 제어 링크(73)를 포함한다. 시험 프로그램중에, 상기 시험유닛(3)은 또한, 시험 시스템 오퍼레이터에 의한 지시에 따라 처리기(55)에 의해 다양한 이득 크기로 자동으로 조정된다.
상기 잡음 시험 측정 시스템의 컴포넌트들을 당해 기술 분야에서 잘 알려진 여러 회사들로부터 구매할 수 있지만, 미국, California, National City 소재 Microwave Solutions, Inc., 사의 증폭기 및 저잡음 정합 증폭기가 이들의 저잡음 특성으로 인해 본 발명을 적용하는데 특히 적합한 것으로 판단된다. 유사하게 미국, New Jersey, Whippany 에 소재한 KDI의 위상 이동 장치 및 미국, California, Milpitas 소재의 Watkins-Johnson 사의 믹서가 역시 본 발명을 적용하는 데 적합한 것으로 판단된다.
본 발명을 실현하기 위해, 상기 잡음측정 시험 시스템의 처리기를 제어하기 위한 소프트웨어 소스 코드가 하기에서 제공된다. 컴파일되지 않은 C++ 포맷으로 제공된 이 같은 소스 코드는 상기 측정 시험 신호의 특성을 측정할 수 있도록 한다. 이 같은 소스 코드는 비디오 표시 장치 상에 상기 측정 시험 신호의 그래프적 표시를 제공하지 않으며, 이는 과도한 실험없이 당해 기술분야에서 통상의 지식을 가진자에 의해 결정될 수 있는 것이다.
#include <analysis.h>
#include <ansi_c.h>
#include <cvirte.h> /* Needed if linking in external compiler; harmless otherwise(외부 컴파일러에 링크가 있을 경우 필요하고 그렇지 않을 경우 해당없음) */
#include <userint.h>
#include "lois.h"
#include <windows.h>
#include <mmsystem.h>
#define ON 1
#define OFF 0
static int panelHandle;
double points[1024];
double noise[1000];
double upper_limit = 8;
double data[1000];
double phase;
double noise1[1000];
double upper_limit1;
double x[1000];
int go=0;
int child_1;
int main (int argc, char *argv[])
{
if (InitCVIRTE (0, argv, 0) == 0) /* Needed if linking in external compiler; harmless otherwise(외부 컴파일러에 링크가 있을 경우 필요하고 그렇지 않을 경우 해당없음) */
return 1; /* out of memory */
if ((panelHandle = LoadPanel (0, "lois.uir", PANEL)) < 0)
return 1;
DisplayPanel (panelHandle);
child_1 = LoadPanel (panelHandle, "lois.uir", CHILD_1);
DisplayPanel (child_1);
RunUserInterface ();
return 0;
}
int CVICALLBACK AcquireData (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_TIMER_TICK:
SineWave(1024, 6.0, 28.18e3, &phase, points);
Spectrum(points, 256);
GaussNoise (100, 3.0,3.0, noise);
Add1D (noise, points, 100, data);
DeleteGraphPlot (panelHandle, PANEL_GRAPH, 1, 0);
PlotY (panelHandle, PANEL_GRAPH, data, 100, VAL_DOUBLE, VAL_THIN_LINE,
VAL_EMPTY_SQUARE, VAL_SOLID, 1, VAL_RED);
SineWave(512, 5, 10.18e3, &phase, points);
Spectrum(points, 128);
PlotLine ( panelHandle, PANEL_GRAPH_2, 10.0, upper_limit, 100, upper_limit,
VAL_BLUE);
DeleteGraphPlot (panelHandle, PANEL_GRAPH_2, 1, 1);
PlotY (panelHandle, PANEL_GRAPH_2, points, 60, VAL_DOUBLE, VAL_THIN_LINE,
VAL_EMPTY_SQUARE, VAL_SOLID, 1, VAL_RED);
PlotLine ( panelHandle, PANEL_GRAPH, 0.0, upper_limit, 100, upper_limit,
VAL_BLUE);
/* Check against alarm limits(경보 한계에 대해 확인) */
if (data[15] >= upper_limit)
SetCtrlVal (panelHandle, PANEL_ALARM_HIGH, ON);
else
SetCtrlVal (panelHandle, PANEL_ALARM_HIGH, OFF);
SineWave(512, 5, 10.18e3, &phase, points);
Spectrum(points, 128);
if (data[7] > upper_limit)
SetCtrlVal (panelHandle, PANEL_LED, ON);
else
SetCtrlVal (panelHandle, PANEL_LED, OFF);
if (data[15] > upper_limit)
SetCtrlVal (panelHandle, PANEL_DISPLAYMSG1, "Fix U1 Amp");
if (data[15] < upper_limit)
SetCtrlVal (panelHandle, PANEL_DISPLAYMSG1, "Thata' Boy");
if (data[7] > upper_limit)
PlaySound("C:\\B2\\LO.WAV", NULL, SND_SYNC);
SetCtrlVal (panelHandle, PANEL_DISPLAYMSG4, " Check LO REF ");
if (data[7] < upper_limit)
SetCtrlVal (panelHandle, PANEL_DISPLAYMSG4, "");
if (data[0] > upper_limit)
SetCtrlVal (panelHandle, PANEL_DISPLAYMSG5, "PM RES fail");
if (data[0] < upper_limit)
SetCtrlVal (panelHandle, PANEL_DISPLAYMSG5, "");
if (data[7] > upper_limit)
SetCtrlVal (panelHandle, PANEL_DISPLAYMSG6, "CAUTION");
if (data[7] < upper_limit)
SetCtrlVal (panelHandle, PANEL_DISPLAYMSG6, "");
break;
}
return 0;
}
int CVICALLBACK SetAlarms(int panel, int control, int event, void *callbackData, int eventData1, int eventData2)
{
if (event == EVENT_VAL_CHANGED)
switch (control) {
case PANEL_UPPER_LIMIT :
GetCtrlVal (panelHandle, PANEL_UPPER_LIMIT, &upper_limit);
break;
}
return 0;
}
int CVICALLBACK FindMaxMin(int panel, int control, int event, void *callbackData, int eventData1, int eventData2)
{
double max, min;
int max_index, min_index;
switch (event) {
case EVENT_COMMIT:
MaxMin1D (points, 100, &max, &max_index, &min, &min_index);
SetCtrlVal (panelHandle, PANEL_MAX, max);
SetCtrlVal (panelHandle, PANEL_MIN, min);
YGraphPopup ("points", points, 100, VAL_DOUBLE);
break;
case EVENT_RIGHT_CLICK:
MessagePopup ("Max & Min Control Help(최대값 최소값 제어 도움말)",
"This control finds the maximum and minimum values of the waveform(이 제어로 파형의 최대값 및 최소값을 찾음)");
break;
}
return(0);
}
int CVICALLBACK Image (int panel, int control, int event, void *callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_COMMIT:
DisplayImageFile (panelHandle, PANEL_PIC1, "lustl.bmp");
break;
}
return 0;
}
int CVICALLBACK Image2 (int panel, int control, int event, void *callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_COMMIT:
DisplayImageFile (panelHandle, PANEL_PIC1, "hatcher.bmp");
break;
}
return 0;
}
int CVICALLBACK Image3 (int panel, int control, int event, void *callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_COMMIT:
DisplayImageFile (panelHandle, PANEL_PIC1, "pan2.bmp");
break;
}
return 0;
}
int CVICALLBACK Comment(int panel, int control, int event, void *callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_LEFT_CLICK:
MessagePopup ( " YOU'VE GOT A LOT OF NERVE !!!(당신은 신경을 많이 쓰고 있군요)",
"I'm calling your wife & boss buster... YOU are going to counciling..I don't listen to SUPERMAN..so why should I listen to you... (전 지금 당신의 집사람과 보스 버스터에게 전화할겁니다. 당신은 공동주택단지로 향하고 있군요... 나는 수퍼맨의 이야기를 듣고싶지 않아요. 내가 왜 당신의 얘기를 들어야하죠?...)");
break;
}
return 0;
}
int CVICALLBACK StopAcquireData (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_COMMIT:
SuspendTimerCallbacks ();
break;
}
return 0;
}
int CVICALLBACK StartAcquireData (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_COMMIT:
ResumeTimerCallbacks ();
break;
}
return 0;
}
int CVICALLBACK Show (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_COMMIT:
HidePanel (child_1);
break;
}
return 0;
}
int CVICALLBACK Show1 (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_COMMIT:
DisplayPanel (child_1);
break;
}
return 0;
}
int CVICALLBACK Shutdown (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_COMMIT:
QuitUserInterface (0);
break;
}
return 0;
}
#include <cvirte.h>
#include "spectrum.h"
#include <ansi_c.h>
#include <analysis.h>
#include <dataacq.h>
#include <userint.h>
#include <utility.h>
#include <easyio.h>
static int helppnl;
static int displaymode = 0;
static double samprate = 20000.0;
static int points = 512;
static char channel[50] = "1";
static int board = 1;
static filtercode = 17;
static int running = 0;
static int mainpnl;
static int filterpnl;
static int scalepnl, daqpanel;
static int i;
static int scale;
static int datawindowtype;
static double rate;
static unsigned long task;
static unsigned long backlog;
static double waveform[2048];
static WindowConst constants;
static double freqspace;
static double spectrum[(2048 + 79)];
static double datawinplot[2048];
static int filterenable = 0;
static int filttype = 0;
static int iirtype = 0;
static int iirorder = 5;
static double iircutoff1 = 5000;
static double iircutoff2 = 8000;
static int filterfunc = 0;
static double passbndrip = .50;
static double stpbndatt = 40;
static int firfiltype = 0;
static int firwindow = 1;
static int firlength = 49;
static double fircutoff1 = 5000;
static double fircutoff2 = 8000;
static double kaiserbeta = 1.00;
static double filtcoefs[80];
static double filteredwave[(2048 + 79)];
static initial = 1;
static int daqpnl;
static int graphscalepnl;
static double waveformymin = 10.0;
static double waveformymax = 10.0;
static double spectrumlinmin = 0.0;
static double spectrumlinmax = 5.0;
static double spectrumdbmin = 200.0;
static double spectrumdbmax = 30.0;
static double spectrumdbmmin = 140.0;
static double spectrumdbmmax = 90.0;
static double timewavemin = 20.0;
static double timewavemax = 20.0;
static int signalswitch = 0;
static int simsignaltype = 0;
static double simsignalfreq = 2000.0;
static double simphase;
static short int errorchk = 0;
static short int boardcode;
static short int status = 0;
void myfoo(void);
int main (int argc, char *argv[])
{
if (InitCVIRTE (0, argv, 0) == 0) /* Needed if linking in external compiler; harmless otherwise(외부 컴파일러에 링크가 있을 경우 필요하고 그렇지 않을 경우 해당 없음)*/
return 1; /* out of memory */
if ((graphscalepnl = LoadPanel (0, "spectrum.uir", SCALEPNL)) < 0)
return 1;
if ((helppnl = LoadPanel (0, "spectrum.uir", HELPPNL)) < 0)
return 1;
if ((daqpnl = LoadPanel (0, "spectrum.uir", DAQPANEL)) < 0)
return 1;
if ((filterpnl = LoadPanel (0, "spectrum.uir", FILTERPNL)) < 0)
return 1;
if ((mainpnl = LoadPanel (0, "spectrum.uir", MAINPNL)) < 0)
return 1;
for (i=0; i<points; i++)
{
datawinplot[i] =1;
}
PlotY (mainpnl, MAINPNL_WINDOWGRAPH, datawinplot, points, VAL_DOUBLE,
VAL_THIN_LINE, VAL_EMPTY_SQUARE, VAL_SOLID, 1, VAL_RED);
SetInputMode (daqpnl, DAQPANEL_SIGNALSWITCH, 1);
DisplayPanel (mainpnl);
RunUserInterface ();
return 0;
}
int CVICALLBACK Getdatawindow (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_COMMIT:
GetCtrlVal (mainpnl, MAINPNL_DATAWINDOW, &datawindowtype);
switch (datawindowtype)
{
case 0:
for (i=0; i<points; i++)
datawinplot[i] = 1;
break;
case 1:
for (i=0; i<points; i++)
datawinplot[i] = .5 (.5*cos(2*3.14*i/points));
break;
case 2:
for (i=0; i<points; i++)
datawinplot[i] = .54 (.46*cos(2*3.14*i/points));
break;
case 3:
for (i=0; i<points; i++)
datawinplot[i] = .42323 (.49755*cos(2*3.14*i/points)) + (.07922*cos(4*3.14*i/points));
break;
case 4:
for (i=0; i<points; i++)
datawinplot[i] = (7938.0/18608.0)((9240.0/18608.0)*cos(2*3.14*i/points))+((1430.0/18608.0)*cos(4*3.14*i/points));
break;
case 5:
for (i=0; i<points; i++)
datawinplot[i] = .42(.5*cos(2*3.14*i/points))+(.08*cos(4*3.14*i/points));
break;
case 6:
for (i=0; i<points; i++)
datawinplot[i] = .2810639(.5208972*cos(2*3.14*i/points))+(.1980399*cos(4*3.14*i/points));
break;
case 7:
for (i=0; i<points; i++)
datawinplot[i] = .42323(.49755*cos(2*3.14*i/points))+(.07922*cos(4*3.14*i/points));
break;
case 8:
for (i=0; i<points; i++)
datawinplot[i] = .42323(.49755*cos(2*3.14*i/points))+(.07922*cos(4*3.14*i/points));
break;
}
DeleteGraphPlot (mainpnl, MAINPNL_WINDOWGRAPH, 1, VAL_DELAYED_DRAW);
PlotY (mainpnl, MAINPNL_WINDOWGRAPH, datawinplot, points, VAL_DOUBLE,
VAL_THIN_LINE, VAL_EMPTY_SQUARE, VAL_SOLID, 1, VAL_RED);
break;
case EVENT_RIGHT_CLICK:
MessagePopup ("Data Window Selection(데이터 윈도우 선택)",
"Selects the window to be applied to the acquired signal.(획득한 신호에 적용될 윈도우를 선택함)");
break;
}
return 0;
}
int CVICALLBACK Getfilter (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_COMMIT:
DisplayPanel (filterpnl);
break;
case EVENT_RIGHT_CLICK:
MessagePopup ("Set Filter Parameters(필터 매개변수 설정)",
"Displays and allows changes to filter parameters.(필터 매개변수의 변화를 실행하고 디스플레이함)");
break;
}
return 0;
}
int CVICALLBACK Start (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_COMMIT:
if (signalswitch == 1) {
AIClearAcquisition (task);
AIStartAcquisition (board, channel, 2*points, samprate, 10, 0, &rate, &task);
}
SetCtrlAttribute (mainpnl, MAINPNL_TIMER, ATTR_ENABLED, 1);
SetInputMode(mainpnl, MAINPNL_START, 0);
SetInputMode(mainpnl, MAINPNL_STOP, 1);
running = 1;
break;
case EVENT_RIGHT_CLICK:
MessagePopup ("Start Data Acquisition(데이터 획득 개시)",
"Begins signal acquisition and processing.(신호 획득 및 처리 개시)");
break;
}
return 0;
}
int CVICALLBACK Stop (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_COMMIT:
SetCtrlAttribute (mainpnl, MAINPNL_TIMER, ATTR_ENABLED, 0);
SetInputMode(mainpnl, MAINPNL_START, 1);
SetInputMode(mainpnl, MAINPNL_STOP, 0);
running = 0;
break;
case EVENT_RIGHT_CLICK:
MessagePopup ("Stop Data Acquisition(데이터 획득 중지)",
"Disables signal acquisition and processing.(신호 획득 및 처리 정지)");
break;
}
return 0;
}
int CVICALLBACK Quit (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_COMMIT:
QuitUserInterface (0);
break;
case EVENT_RIGHT_CLICK:
MessagePopup ("Quit(종료)",
"Quits the program.(프로그램 종료)");
break;
}
return 0;
}
int CVICALLBACK Getscale (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_COMMIT:
GetCtrlVal (mainpnl, MAINPNL_SCALE, &scale);
break;
case EVENT_RIGHT_CLICK:
MessagePopup ("Set Axis(축 설정)",
"Sets the axis on the frequency graph to linear, dB, or dBm."(선형, dB, dBm으로 주파수 그래프에 축 설정);
break;
}
return 0;
}
/* filtercoefs array. The power spectrum of the filtered wave(필터계수 배열. 여파된 파동의 출력스펙트럼) */
int CVICALLBACK Getdata (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_TIMER_TICK:
if (signalswitch == 0) {
switch (simsignaltype) {
case 0:
SineWave (points, 5.0, (simsignalfreq/20000.0), &simphase, waveform);
break;
case 1:
SquareWave (points, 5.0, (simsignalfreq/20000.0), &simphase, 50.0, waveform);
break;
case 2:
TriangleWave (points, 5.0, (simsignalfreq/20000.0), &simphase, waveform);
break;
case 3:
Impulse (points, 100.0, 0, waveform);
break;
}
}
else {
status = AIReadAcquisition (task, points, LATEST_MODE, &backlog,GROUP_BY_CHANNEL, waveform);
if (abs(status) == 10846) {
SetCtrlAttribute (mainpnl, MAINPNL_TIMER, ATTR_ENABLED, 0);
MessagePopup ("DAQ Error",
"The sampling rate you have selected is too large for your computer. Data in the buffer is being overwritten. Please change your sampling rate to a lower value.(선택한 샘플링 속도가 컴퓨터에 비해 너무 큽니다. 버퍼의 데이터를 덮어쓰고 있으므로 샘플링 속도를 낮은 값으로 바꿔주세요)");
DisplayPanel (daqpnl);
}
}
DeleteGraphPlot (mainpnl, MAINPNL_TIMEGRAPH, 1, VAL_DELAYED_DRAW);
SetAxisRange (mainpnl, MAINPNL_TIMEGRAPH, VAL_NO_CHANGE, 0.0, 1.0,
VAL_MANUAL, waveformymin, waveformymax);
PlotY (mainpnl, MAINPNL_TIMEGRAPH, waveform, points, VAL_DOUBLE,
VAL_THIN_LINE, VAL_EMPTY_SQUARE, VAL_SOLID, 1, VAL_RED);
ProcessDrawEvents ();
ScaledWindow (waveform, points, datawindowtype, &constants);
if (filterenable == 0) {
AutoPowerSpectrum (waveform, points, (1/samprate), spectrum,
&freqspace);
DeleteGraphPlot (mainpnl, MAINPNL_FREQGRAPH, 1, VAL_DELAYED_DRAW);
if (displaymode==0) {
switch (scale) {
case 0:
SetAxisRange (mainpnl, MAINPNL_FREQGRAPH, VAL_NO_CHANGE, 0.0, 1.0,
(simsignaltype==3)?VAL_AUTOSCALE:VAL_MANUAL, spectrumlinmin, spectrumlinmax);
break;
case 1:
for (i=0; i<(points/2); i++) {
spectrum[i] = 20*(log10(spectrum[i]));
}
SetAxisRange (mainpnl, MAINPNL_FREQGRAPH, VAL_NO_CHANGE, 0.0, 1.0,
(simsignaltype==3)?VAL_AUTOSCALE:VAL_MANUAL, spectrumdbmin, spectrumdbmax);
break;
case 2:
for (i=0; i<(points/2); i++) {
spectrum[i] = 20*(log10(spectrum[i]/.001));
}
SetAxisRange (mainpnl, MAINPNL_FREQGRAPH, VAL_NO_CHANGE, 0.0, 1.0,
(simsignaltype==3)?VAL_AUTOSCALE:VAL_MANUAL, spectrumdbmmin, spectrumdbmmax);
break;
}
PlotWaveform (mainpnl, MAINPNL_FREQGRAPH, spectrum, points/2,
VAL_DOUBLE, 1.0, 0.0, 0.0, freqspace, VAL_THIN_LINE,
VAL_EMPTY_SQUARE, VAL_SOLID, 1, VAL_RED);
}
else {
SetAxisRange (mainpnl, MAINPNL_FREQGRAPH, VAL_AUTOSCALE, 0.0, 1.0,
VAL_MANUAL, timewavemin, timewavemax);
PlotY (mainpnl, MAINPNL_FREQGRAPH, waveform, points, VAL_DOUBLE,
VAL_THIN_LINE, VAL_EMPTY_SQUARE, VAL_SOLID, 1, VAL_RED);
}
}
else {
switch (filtercode) {
case 1: /* LP BUTTERWORTH IIR */
Bw_LPF (waveform, points, samprate, iircutoff1, iirorder, filteredwave);
break;
case 2: /* HP BUTTERWORTH IIR */
Bw_HPF (waveform, points, samprate, iircutoff1, iirorder, filteredwave);
break;
case 3: /* BP BUTTERWORTH IIR */
Bw_BPF (waveform, points, samprate, iircutoff1, iircutoff2, iirorder, filteredwave);
break;
case 4: /* BS BUTTERWORTH IIR */
Bw_BSF (waveform, points, samprate, iircutoff1, iircutoff2, iirorder,
filteredwave);
break;
case 5: /* LP CHEBYSHEV IIR */
Ch_LPF (waveform, points, samprate, iircutoff1, passbndrip, iirorder, filteredwave);
break;
case 6: /* HP CHEBYSHEV IIR */
Ch_HPF (waveform, points, samprate, iircutoff1, passbndrip, iirorder, filteredwave);
break;
case 7: /* BP CHEBYSHEV IIR */
Ch_BPF (waveform, points, samprate, iircutoff1, iircutoff2, passbndrip, iirorder, filteredwave);
break;
case 8: /* BS CHEBYSHEV IIR */
Ch_BSF (waveform, points, samprate, iircutoff1, iircutoff2, passbndrip, iirorder, filteredwave);
break;
case 9: /* LP INVERSE CHEBYSHEV IIR */
InvCh_LPF (waveform, points, samprate, iircutoff1, stpbndatt, iirorder, filteredwave);
break;
case 10: /* HP INVERSE CHEBYSHEV IIR */
InvCh_HPF (waveform, points, samprate, iircutoff1, stpbndatt, iirorder, filteredwave);
break;
case 11: /* BP INVERSE CHEBYSHEV IIR */
InvCh_BPF (waveform, points, samprate, iircutoff1, iircutoff2, stpbndatt, iirorder, filteredwave);
break;
case 12: /* BS INVERSE CHEBYSHEV IIR */
InvCh_BSF (waveform, points, samprate, iircutoff1, iircutoff2, stpbndatt, iirorder, filteredwave);
break;
case 13: /* LP ELLIPTIC IIR */
Elp_LPF (waveform, points, samprate, iircutoff1, passbndrip, stpbndatt, iirorder, filteredwave);
break;
case 14: /* HP ELLIPTIC IIR */
Elp_HPF (waveform, points, samprate, iircutoff1, passbndrip, stpbndatt, iirorder, filteredwave);
break;
case 15: /* BP ELLIPTIC IIR */
Elp_BPF (waveform, points, samprate, iircutoff1, iircutoff2, passbndrip, stpbndatt, iirorder, filteredwave);
break;
case 16: /* BS ELLIPTIC IIR */
Elp_BSF (waveform, points, samprate, iircutoff1, iircutoff2, passbndrip, stpbndatt, iirorder, filteredwave);
break;
case 17: /* LP WINDOW FIR */
Wind_LPF (samprate, fircutoff1, firlength, filtcoefs, firwindow);
Convolve (filtcoefs, firlength, waveform, points, filteredwave);
break;
case 18: /* HP WINDOW FIR */
Wind_HPF (samprate, fircutoff1, firlength, filtcoefs, firwindow);
Convolve (filtcoefs, firlength, waveform, points, filteredwave);
break;
case 19: /* BP WINDOW FIR */
Wind_BPF (samprate, fircutoff1, fircutoff2, firlength, filtcoefs, firwindow);
Convolve (filtcoefs, firlength, waveform, points, filteredwave);
break;
case 20: /* BS WINDOW FIR */
Wind_BSF (samprate, fircutoff1, fircutoff2, firlength, filtcoefs,firwindow);
Convolve (filtcoefs, firlength,waveform,points, filteredwave);
break;
case 21: /* LP KAISER FIR */
Ksr_LPF (samprate, fircutoff1, firlength, filtcoefs, kaiserbeta);
Convolve (filtcoefs, firlength, waveform, points, filteredwave);
break;
case 22: /* HP KAISER FIR */
Ksr_HPF (samprate, fircutoff1, firlength, filtcoefs, kaiserbeta);
Convolve (filtcoefs, firlength, waveform, points, filteredwave);
break;
case 23: /* BP KAISER FIR */
Ksr_BPF (samprate, fircutoff1, fircutoff2, firlength, filtcoefs, kaiserbeta);
Convolve (filtcoefs, firlength, waveform, points, filteredwave);
break;
case 24: /* BS KAISER FIR */
Ksr_BSF (samprate, fircutoff1, fircutoff2, firlength, filtcoefs, kaiserbeta);
Convolve (filtcoefs,firlength, waveform, points, filteredwave);
break;
}
AutoPowerSpectrum (filteredwave, points, (1/samprate), spectrum, &freqspace);
DeleteGraphPlot (mainpnl, MAINPNL_FREQGRAPH, 1, VAL_DELAYED_DRAW);
if (displaymode == 0) {
switch (scale) {
case 0:
SetAxisRange (mainpnl, MAINPNL_FREQGRAPH, VAL_NO_CHANGE, 0.0, 1.0,
(simsignaltype==3)?VAL_AUTOSCALE:VAL_MANUAL, spectrumlinmin, spectrumlinmax);
break;
case 1:
for (i=0; i<(points/2); i++) {
spectrum[i] = 20*(log10(spectrum[i]));
}
SetAxisRange (mainpnl, MAINPNL_FREQGRAPH, VAL_NO_CHANGE, 0.0, 1.0,
(simsignaltype==3)?VAL_AUTOSCALE:VAL_MANUAL, spectrumdbmin, spectrumdbmax);
break;
case 2:
for (i=0; i<(points/2); i++) {
spectrum[i] = 20*(log10(spectrum[i]/.001));
}
SetAxisRange (mainpnl, MAINPNL_FREQGRAPH, VAL_NO_CHANGE, 0.0, 1.0,
(simsignaltype==3)?VAL_AUTOSCALE:VAL_MANUAL, spectrumdbmmin, spectrumdbmmax);
break;
}
PlotWaveform (mainpnl, MAINPNL_FREQGRAPH, spectrum, points/2,
VAL_DOUBLE, 1.0, 0.0, 0.0, freqspace, VAL_THIN_LINE,
VAL_EMPTY_SQUARE, VAL_SOLID, 1, VAL_RED);
}
else {
SetAxisRange (mainpnl, MAINPNL_FREQGRAPH, VAL_AUTOSCALE, 0.0, 1.0,
VAL_MANUAL, timewavemin, timewavemax);
PlotY (mainpnl, MAINPNL_FREQGRAPH, filteredwave, points, VAL_DOUBLE,
VAL_THIN_LINE, VAL_EMPTY_SQUARE, VAL_SOLID, 1, VAL_RED);
}
}
break;
}
return 0;
}
void SetFilterPnlInputModes(char * charArray)
{
SetInputMode (filterpnl, FILTERPNL_FILTTYPE, charArray[ 0]=='1');
SetInputMode (filterpnl, FILTERPNL_IIRTYPE, charArray[ 1]=='1');
SetInputMode (filterpnl, FILTERPNL_IIRORDER, charArray[ 2]=='1');
SetInputMode (filterpnl, FILTERPNL_IIRCUTOFF1, charArray[ 3]=='1');
SetInputMode (filterpnl, FILTERPNL_IIRCUTOFF2, charArray[ 4]=='1');
SetInputMode (filterpnl, FILTERPNL_FILTERFUNC, charArray[ 5]=='1');
SetInputMode (filterpnl, FILTERPNL_PASSBNDRIP, charArray[ 6]=='1');
SetInputMode (filterpnl, FILTERPNL_STPBNDATT, charArray[ 7]=='1');
SetInputMode (filterpnl, FILTERPNL_FIRFILTYPE, charArray[ 8]=='1');
SetInputMode (filterpnl, FILTERPNL_FIRWINDOW, charArray[ 9]=='1');
SetInputMode (filterpnl, FILTERPNL_FIRLENGTH, charArray[10]=='1');
SetInputMode (filterpnl, FILTERPNL_FIRCUTOFF1, charArray[11]=='1');
SetInputMode (filterpnl, FILTERPNL_FIRCUTOFF2, charArray[12]=='1');
SetInputMode (filterpnl, FILTERPNL_KAISERBETA, charArray[13]=='1');
}
int CVICALLBACK Enablefilters (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_COMMIT:
GetCtrlVal (filterpnl, FILTERPNL_FILTERENABLE, &filterenable);
if (filterenable == 0)
SetFilterPnlInputModes("00000000000000");
else if ((filterenable == 1) && (initial == 1))
{
initial = 0;
SetFilterPnlInputModes("10000100111100");
}
else
{
switch (filttype) {
case 0:
switch (firfiltype) {
case 0:
switch (filterfunc) {
case 0:
SetFilterPnlInputModes("10000100111100");
break;
case 1:
SetFilterPnlInputModes("10000100111100");
break;
case 2:
SetFilterPnlInputModes("10000100111110");
break;
case 3:
SetFilterPnlInputModes("10000100111110");
break;
}
break;
case 1:
switch (filterfunc) {
case 0:
SetFilterPnlInputModes("10000100101101");
break;
case 1:
SetFilterPnlInputModes("10000100101101");
break;
case 2:
SetFilterPnlInputModes("10000100101111");
break;
case 3:
SetFilterPnlInputModes("10000100101111");
break;
}
break;
}
break;
case 1:
switch (iirtype) {
case 0:
switch (filterfunc) {
case 0:
SetFilterPnlInputModes("11110100000000");
break;
case 1:
SetFilterPnlInputModes("11110100000000");
break;
case 2:
SetFilterPnlInputModes("11111100000000");
break;
case 3:
SetFilterPnlInputModes("11111100000000");
break;
}
break;
case 1:
switch (filterfunc) {
case 0:
SetFilterPnlInputModes("11110110000000");
break;
case 1:
SetFilterPnlInputModes("11110110000000");
break;
case 2:
SetFilterPnlInputModes("11111110000000");
break;
case 3:
SetFilterPnlInputModes("11111110000000");
break;
}
break;
case 2:
switch (filterfunc) {
case 0:
SetFilterPnlInputModes("11110101000000");
break;
case 1:
SetFilterPnlInputModes("11110101000000");
break;
case 2:
SetFilterPnlInputModes("11111101000000");
break;
case 3:
SetFilterPnlInputModes("11111101000000");
break;
}
break;
case 3:
switch (filterfunc) {
case 0:
SetFilterPnlInputModes("11110111000000");
break;
case 1:
SetFilterPnlInputModes("11110111000000");
break;
case 2:
SetFilterPnlInputModes("11111111000000");
break;
case 3:
SetFilterPnlInputModes("11111111000000");
break;
}
break;
}
break;
}
}
break;
case EVENT_RIGHT_CLICK:
MessagePopup ("Enable/Disable Filters(필터 동작/정지)",
"Enables or disables filtering of the acquired signal.(획득한 신호의 여파를 동작/정지)");
break;
}
return 0;
}
int CVICALLBACK Getfiltype (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_COMMIT:
GetCtrlVal (filterpnl, FILTERPNL_FILTTYPE, &filttype);
switch (filttype) {
case 0: /* FIR */
switch (firfiltype) {
case 0: /* WINDOW */
switch (filterfunc) {
case 0: /* LOWPASS */
filtercode = 17; /* LP WINDOW FIR */
SetFilterPnlInputModes("10000100111100");
break;
case 1: /* HIGHPASS */
filtercode = 18; /* HP WINDOW FIR */
SetFilterPnlInputModes("10000100111100");
break;
case 2: /* BANDPASS */
filtercode = 19; /* BP WINDOW FIR */
SetFilterPnlInputModes("10000100111110");
break;
case 3: /* BANDSTOP */
filtercode = 20; /* BS WINDOW FIR */
SetFilterPnlInputModes("10000100111110");
break;
}
break;
case 1: /* KAISER */
switch (filterfunc) {
case 0: /* LOWPASS */
filtercode = 21; /* LP KAISER FIR */
SetFilterPnlInputModes("10000100101101");
break;
case 1: /* HIGHPASS */
filtercode = 22; /* HP KAISER FIR */
SetFilterPnlInputModes("10000100101101");
break;
case 2: /* BANDPASS */
filtercode = 23; /* BP KAISER FIR */
SetFilterPnlInputModes("10000100101111");
break;
case 3: /* BANDSTOP */
filtercode = 24; /* BS KAISER FIR */
SetFilterPnlInputModes("10000100101111");
break;
}
break;
}
break;
case 1: /* IIR */
switch (iirtype) {
case 0: /* BUTTERWORTH */
switch (filterfunc) {
case 0: /* LOWPASS */
filtercode = 1; /* LP BUTTERWORTH IIR */
SetFilterPnlInputModes("11110100000000");
break;
case 1: /* HIGHPASS */
filtercode = 2; /* HP BUTTERWORTH IIR */
SetFilterPnlInputModes("11110100000000");
break;
case 2: /* BANDPASS */
filtercode = 3; /* BP BUTTERWORTH IIR */
SetFilterPnlInputModes("11111100000000");
break;
case 3: /* BANDSTOP */
filtercode = 4; /* BS BUTTERWORTH IIR */
SetFilterPnlInputModes("11111100000000");
break;
}
break;
case 1: /* CHEBYSHEV */
switch (filterfunc) {
case 0: /* LOWPASS */
filtercode = 5; /* LP CHEBYSHEV IIR */
SetFilterPnlInputModes("11110110000000");
break;
case 1: /* HIGHPASS */
filtercode = 6; /* HP CHEBYSHEV IIR */
SetFilterPnlInputModes("11110110000000");
break;
case 2: /* BANDPASS */
filtercode = 7; /* BP CHEBYSHEV IIR */
SetFilterPnlInputModes("11111110000000");
break;
case 3: /* BANDSTOP */
filtercode = 8; /* BS CHEBYSHEV IIR */
SetFilterPnlInputModes("11111110000000");
break;
}
break;
case 2: /* INV CHEBYSHEV */
switch (filterfunc) {
case 0: /* LOWPASS */
filtercode = 9; /* LP INV CHEBYSHEV IIR */
SetFilterPnlInputModes("11110101000000");
break;
case 1: /* HIGHPASS */
filtercode = 10; /* HP INV CHEBYSHEV */
SetFilterPnlInputModes("11110101000000");
break;
case 2: /* BANDPASS */
filtercode = 11; /* BP INVERSE CHEBYSHEV */
SetFilterPnlInputModes("11111101000000");
break;
case 3: /* BANDSTOP */
filtercode = 12; /* BS INV CHEBYSHEV IIR */
SetFilterPnlInputModes("11111101000000");
break;
}
break;
case 3: /* ELLIPTIC */
switch (filterfunc) {
case 0: /* LOWPASS */
filtercode = 13; /* LP ELLIPTIC IIR */
SetFilterPnlInputModes("11110111000000");
break;
case 1: /* HIGHPASS */
filtercode = 14; /* HP ELLIPTIC IIR */
SetFilterPnlInputModes("11110111000000");
break;
case 2: /* BANDPASS */
filtercode = 15; /* BP ELLIPTIC IIR */
SetFilterPnlInputModes("11111111000000");
break;
case 3: /* BANDSTOP */
filtercode = 16; /* BS ELLIPTIC IIR */
SetFilterPnlInputModes("11111111000000");
break;
} /* END OF SWITCH ON FILTERFUNC */
break;
} /* END OF SWITCH ON IIRTYPE */
break;
} /* END OF SWITCH ON FILTTYPE */
break;
case EVENT_RIGHT_CLICK:
MessagePopup ("Select Filter Type(필터 종류 선택)",
"Selects between IIR and FIR filters.(IIR과 FIR 필터사이에서 선택)");
break;
} /* END OF SWITCH ON COMMIT */
return 0;
} /* END OF FUNCTION */
int CVICALLBACK Getiirtype (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_COMMIT:
GetCtrlVal (filterpnl, FILTERPNL_IIRTYPE, &iirtype);
switch (iirtype) {
case 0: /* BUTTERWORTH */
switch (filterfunc) {
case 0: /* LOWPASS */
filtercode = 1; /* LP BUTTERWORTH IIR */
SetFilterPnlInputModes("11110100000000");
break;
case 1: /* HIGHPASS */
filtercode = 2; /* HP BUTTERWORTH IIR */
SetFilterPnlInputModes("11110100000000");
break;
case 2: /* BANDPASS */
filtercode = 3; /* BP BUTTERWORTH IIR */
SetFilterPnlInputModes("11111100000000");
break;
case 3: /* BANDSTOP */
filtercode = 4; /* BS BUTTERWORTH IIR */
SetFilterPnlInputModes("11111100000000");
break;
}
break;
case 1: /* CHEBYSHEV */
switch (filterfunc) {
case 0: /* LOWPASS */
filtercode = 5; /* LP CHEBYSHEV IIR */
SetFilterPnlInputModes("11110110000000");
break;
case 1: /* HIGHPASS */
filtercode = 6; /* HP CHEBYSHEV IIR */
SetFilterPnlInputModes("11110110000000");
break;
case 2: /* BANDPASS */
filtercode = 7; /* BP CHEBYSHEV IIR */
SetFilterPnlInputModes("11111110000000");
break;
case 3: /* BANDSTOP */
filtercode = 8; /* BS CHEBYSHEV IIR */
SetFilterPnlInputModes("11111110000000");
break;
}
break;
case 2: /* INV CHEBYSHEV */
switch (filterfunc) {
case 0: /* LOWPASS */
filtercode = 9; /* LP INV CHEBYSHEV IIR */
SetFilterPnlInputModes("11110101000000");
break;
case 1: /* HIGHPASS */
filtercode = 10; /* HP INV CHEBYSHEV */
SetFilterPnlInputModes("11110101000000");
break;
case 2: /* BANDPASS */
filtercode = 11; /* BP INVERSE CHEBYSHEV */
SetFilterPnlInputModes("11111101000000");
break;
case 3: /* BANDSTOP */
filtercode = 12; /* BS INV CHEBYSHEV IIR */
SetFilterPnlInputModes("11111101000000");
break;
}
break;
case 3: /* ELLIPTIC */
switch (filterfunc) {
case 0: /* LOWPASS */
filtercode = 13; /* LP ELLIPTIC IIR */
SetFilterPnlInputModes("11110111000000");
break;
case 1: /* HIGHPASS */
filtercode = 14; /* HP ELLIPTIC IIR */
SetFilterPnlInputModes("11110111000000");
break;
case 2: /* BANDPASS */
filtercode = 15; /* BP ELLIPTIC IIR */
SetFilterPnlInputModes("11111111000000");
break;
case 3: /* BANDSTOP */
filtercode = 16; /* BS ELLIPTIC IIR */
SetFilterPnlInputModes("11111111000000");
break;
} /* END OF SWITCH ON FILTERFUNC */
break;
} /* END OF SWITCH ON IIRTYPE */
break;
case EVENT_RIGHT_CLICK:
MessagePopup ("Select IIR Filter Type(IIR 필터 종류 선택)",
"Select between Butterworth, Chebyshev, Inverse Chebyshev, or Elliptic IIR Filters.(Butterworth, Chebyshev, Inverse Chebyshev, Elliptic IIR Filters 사이에서 선택)");
break;
} /* END OF SWITCH ON COMMIT */
return 0;
} /* END OF FUNCTION */
void CheckCutoffs (void)
{
if ((filterenable == 1) && (filttype == 0) && ((filterfunc ==2) || (filterfunc==3))) {
if (fircutoff2 <= fircutoff1) {
MessagePopup ("FIR Cutoff Frequency Error(FIR 컷오프 주파수 에러)",
"The upper cutoff frequency must be greater than the lower cutoff frequency. The upper cutoff frequency has been reset to 100 Hz greater than the lower cutoff frequency.(컷오프 주파수 상한은 컷오프 주파수 하한보다 커야한다. 컷오프 주파수 상한은 컷오프 주파수 하한보다 100Hz 크게 재설정되었다)");
if (fircutoff1 == (samprate/2)) {
fircutoff1 = fircutoff1 100;
SetCtrlVal (filterpnl, FILTERPNL_FIRCUTOFF1, fircutoff1);
}
fircutoff2 = fircutoff1 + 100;
SetCtrlVal (filterpnl, FILTERPNL_FIRCUTOFF2, fircutoff2);
}
}
if ((filterenable == 1) && (filttype == 1) && ((filterfunc ==2) || (filterfunc==3))) {
if (iircutoff2 <= iircutoff1) {
MessagePopup ("IIR Cutoff Frequency Error(IIR 컷오프 주파수 에러)",
"The upper cutoff frequency must be greater than the lower cutoff frequency. The upper cutoff frequency has been reset to 100 Hz greater than the lower cutoff frequency.(컷오프 주파수 상한은 컷오프 주파수 하한보다 커야한다. 컷오프 주파수 상한은 컷오프 주파수 하한보다 100Hz 크게 재설정되었다)");
if (iircutoff1 == (samprate/2)) {
iircutoff1 = iircutoff1 100;
SetCtrlVal (filterpnl, FILTERPNL_IIRCUTOFF1, iircutoff1);
}
iircutoff2 = iircutoff1 + 100;
SetCtrlVal (filterpnl, FILTERPNL_IIRCUTOFF2, iircutoff2);
}
}
}
int CVICALLBACK Getiirorder (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_COMMIT:
GetCtrlVal (filterpnl, FILTERPNL_IIRORDER, &iirorder);
break;
case EVENT_RIGHT_CLICK:
MessagePopup ("Set IIR Filter Order(IIR 필터 순서 설정)",
"Sets the order of the IIR Filter.(IIR 필터의 순서 설정)");
break;
}
return 0;
}
int CVICALLBACK Getfircutoff1 (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_COMMIT:
GetCtrlVal (filterpnl, FILTERPNL_FIRCUTOFF1, &fircutoff1);
CheckCutoffs();
break;
case EVENT_RIGHT_CLICK:
MessagePopup ("Set Lower FIR Cutoff Frequency(FIR 컷오프 주파수 하한 설정",
"Sets the lower cutoff frequency of the FIR filter (in Hertz). This is the only cutoff frequency for Lowpass and Highpass filters.(FIR 필터의 컷오프 주파수 하한 설정(Hz). 이는 저역 및 고역 통과 필터에 대해 유일한 컷오프 주파수이다)");
break;
}
return 0;
}
int CVICALLBACK Getiircutoff1 (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_COMMIT:
GetCtrlVal (filterpnl, FILTERPNL_IIRCUTOFF1, &iircutoff1);
CheckCutoffs();
break;
case EVENT_RIGHT_CLICK:
MessagePopup ("Set Lower IIR Cutoff Frequency(IIR 컷오프 주파수 하한 설정)",
"Sets the lower cutoff frequency of the IIR filter (in Hertz). This is the only cutoff frequency for Lowpass and Highpass filters.(IIR 필터의 컷오프 주파수 하한 설정(Hz). 이는 저역 및 고역 통과 필터에 대해 유일한 컷오프 주파수이다)");
break;
}
return 0;
}
int CVICALLBACK Getfircutoff2 (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_COMMIT:
GetCtrlVal (filterpnl, FILTERPNL_FIRCUTOFF2, &fircutoff2);
CheckCutoffs();
break;
case EVENT_RIGHT_CLICK:
MessagePopup ("Set Upper FIR Cutoff Frequency(FIR 컷오프 주파수 상한 결정)",
"Sets the upper cutoff frequency of the FIR filter (in Hertz). This is used only with Bandpass and Bandstop filters.(FIR 필터의 컷오프 주파수 상한 설정(Hz). 이는 대역통과 및 대역정지 필터와 함께로만 사용된다)");
break;
}
return 0;
}
int CVICALLBACK Getiircutoff2 (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_COMMIT:
GetCtrlVal (filterpnl, FILTERPNL_IIRCUTOFF2, &iircutoff2);
CheckCutoffs();
break;
case EVENT_RIGHT_CLICK:
MessagePopup ("Set Upper IIR Cutoff Frequency(IIR 컷오프 주파수 상한 설정)",
"Sets the upper cutoff frequency of the IIR filter (in Hertz). This is used only with Bandpass and Bandstop filters.(IIR 필터의 상한 컷오프 주파수 설정(H). 이는 대역통과 및 대역정지 필터로만 사용된다)");
break;
}
return 0;
}
int CVICALLBACK Getpassbndrip (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_COMMIT:
GetCtrlVal (filterpnl, FILTERPNL_PASSBNDRIP, &passbndrip);
break;
case EVENT_RIGHT_CLICK:
MessagePopup ("Select Ripple(리플 선택)",
"Sets the value (in dB) of ripple in the passband for Chebyshev and Elliptic filters.(Chebyshev 및 Elliptic 필터에 대해 대역통과에서 리플값 설정(dB))" );
break;
}
return 0;
}
int CVICALLBACK Getstpbndatt (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_COMMIT:
GetCtrlVal (filterpnl, FILTERPNL_STPBNDATT, &stpbndatt);
break;
case EVENT_RIGHT_CLICK:
MessagePopup ("Select Attenuation(감쇠 선택)",
"Sets the value (in dB) of attenuation in the stopband for Inverse Chebyshev and Elliptic filters.(Inverse Chebyshev 및 Elliptic 필터에 대한 정지대역에서 감쇠값 설정(dB))");
break;
}
return 0;
}
int CVICALLBACK Getfirfiltype (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_COMMIT:
GetCtrlVal (filterpnl, FILTERPNL_FIRFILTYPE, &firfiltype);
switch (firfiltype) {
case 0: /* WINDOW */
switch (filterfunc) {
case 0: /* LOWPASS */
filtercode = 17; /* LP WINDOW FIR */
SetFilterPnlInputModes("10000100111100");
break;
case 1: /* HIGHPASS */
filtercode = 18; /* HP WINDOW FIR */
SetFilterPnlInputModes("10000100111100");
break;
case 2: /* BANDPASS */
filtercode = 19; /* BP WINDOW FIR */
SetFilterPnlInputModes("10000100111110");
break;
case 3: /* BANDSTOP */
filtercode = 20; /* BS WINDOW FIR */
SetFilterPnlInputModes("10000100111110");
break;
}
break;
case 1: /* KAISER */
switch (filterfunc) {
case 0: /* LOWPASS */
filtercode = 21; /* LP KAISER FIR */
SetFilterPnlInputModes("10000100101101");
break;
case 1: /* HIGHPASS */
filtercode = 22; /* HP KAISER FIR */
SetFilterPnlInputModes("10000100101101");
break;
case 2: /* BANDPASS */
filtercode = 23; /* BP KAISER FIR */
SetFilterPnlInputModes("10000100101111");
break;
case 3: /* BANDSTOP */
filtercode = 24; /* BS KAISER FIR */
SetFilterPnlInputModes("10000100101111");
break;
}
break;
} /* END OF SWITCH ON FIRFILTYPE */
break;
case EVENT_RIGHT_CLICK:
MessagePopup ("Select FIR Filter Type(FIR 필터 종류 선택)",
"Sets type of FIR filter used (Window or Kaiser methods).(사용된 FIR 필터 종류 설정(위도우나 Kaiser 방법))");
break;
} /* END OF SWITCH ON COMMIT */
return 0;
} /* END OF FUNCTION */
int CVICALLBACK Getfirwindow (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_COMMIT:
GetCtrlVal (filterpnl, FILTERPNL_FIRWINDOW, &firwindow);
break;
case EVENT_RIGHT_CLICK:
MessagePopup ("Select FIR Window(FIR 윈도우 선택)",
"Selects the window used in the FIR filter (used in window mode only).(윈도우 모드에만 사용되는) FIR 필터에 사용되는 윈도우 선택)");
break;
}
return 0;
}
int CVICALLBACK Getfirlength (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_COMMIT:
GetCtrlVal (filterpnl, FILTERPNL_FIRLENGTH, &firlength);
if (!(firlength%2)) {
firlength++;
SetCtrlVal (filterpnl, FILTERPNL_FIRLENGTH, firlength);
}
break;
case EVENT_RIGHT_CLICK:
MessagePopup ("Select FIR Filter Length(FIR 필터 길이 선택)",
"Sets the number of points for the FIR filter(Odd value between 179).(FIR 필터에 대한 포인트 숫자 설정(1-79 사이의 홀수값))");
break;
}
return 0;
}
int CVICALLBACK Getkaibeta (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_COMMIT:
GetCtrlVal (filterpnl, FILTERPNL_KAISERBETA, &kaiserbeta);
break;
case EVENT_RIGHT_CLICK:
MessagePopup ("Select Beta(베타 선택)",
"Sets the value for the beta parameter in the Kaiser window.(Kaiser 윈도우에서 베타 매개변수에 대한 값 설정)");
break;
}
return 0;
}
int CVICALLBACK Getfilterfunc (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_COMMIT:
GetCtrlVal (filterpnl, FILTERPNL_FILTERFUNC, &filterfunc);
switch (filttype) {
case 0: /* FIR */
switch (firfiltype) {
case 0: /* WINDOW */
switch (filterfunc) {
case 0: /* LOWPASS */
filtercode = 17; /* LP WINDOW FIR */
SetFilterPnlInputModes("10000100111100");
break;
case 1: /* HIGHPASS */
filtercode = 18; /* HP WINDOW FIR */
SetFilterPnlInputModes("10000100111100");
break;
case 2: /* BANDPASS */
filtercode = 19; /* BP WINDOW FIR */
SetFilterPnlInputModes("10000100111110");
break;
case 3: /* BANDSTOP */
filtercode = 20; /* BS WINDOW FIR */
SetFilterPnlInputModes("10000100111110");
break;
}
break;
case 1: /* KAISER */
switch (filterfunc) {
case 0: /* LOWPASS */
filtercode = 21; /* LP KAISER FIR */
SetFilterPnlInputModes("10000100101101");
break;
case 1: /* HIGHPASS */
filtercode = 22; /* HP KAISER FIR */
SetFilterPnlInputModes("10000100101101");
break;
case 2: /* BANDPASS */
filtercode = 23; /* BP KAISER FIR */
SetFilterPnlInputModes("10000100101111");
break;
case 3: /* BANDSTOP */
filtercode = 24; /* BS KAISER FIR */
SetFilterPnlInputModes("10000100101111");
break;
}
break;
}
break;
case 1: /* IIR */
switch (iirtype) {
case 0: /* BUTTERWORTH */
switch (filterfunc) {
case 0: /* LOWPASS */
filtercode = 1; /* LP BUTTERWORTH IIR */
SetFilterPnlInputModes("11110100000000");
break;
case 1: /* HIGHPASS */
filtercode = 2; /* HP BUTTERWORTH IIR */
SetFilterPnlInputModes("11110100000000");
break;
case 2: /* BANDPASS */
filtercode = 3; /* BP BUTTERWORTH IIR */
SetFilterPnlInputModes("11111100000000");
break;
case 3: /* BANDSTOP */
filtercode = 4; /* BS BUTTERWORTH IIR */
SetFilterPnlInputModes("11111100000000");
break;
}
break;
case 1: /* CHEBYSHEV */
switch (filterfunc) {
case 0: /* LOWPASS */
filtercode = 5; /* LP CHEBYSHEV IIR */
SetFilterPnlInputModes("11110110000000");
break;
case 1: /* HIGHPASS */
filtercode = 6; /* HP CHEBYSHEV IIR */
SetFilterPnlInputModes("11110110000000");
break;
case 2: /* BANDPASS */
filtercode = 7; /* BP CHEBYSHEV IIR */
SetFilterPnlInputModes("11111110000000");
break;
case 3: /* BANDSTOP */
filtercode = 8; /* BS CHEBYSHEV IIR */
SetFilterPnlInputModes("11111110000000");
break;
}
break;
case 2: /* INV CHEBYSHEV */
switch (filterfunc) {
case 0: /* LOWPASS */
filtercode = 9; /* LP INV CHEBYSHEV IIR */
SetFilterPnlInputModes("11110101000000");
break;
case 1: /* HIGHPASS */
filtercode = 10; /* HP INV CHEBYSHEV */
SetFilterPnlInputModes("11110101000000");
break;
case 2: /* BANDPASS */
filtercode = 11; /* BP INVERSE CHEBYSHEV */
SetFilterPnlInputModes("11111101000000");
break;
case 3: /* BANDSTOP */
filtercode = 12; /* BS INV CHEBYSHEV IIR */
SetFilterPnlInputModes("11111101000000");
break;
}
break;
case 3: /* ELLIPTIC */
switch (filterfunc) {
case 0: /* LOWPASS */
filtercode = 13; /* LP ELLIPTIC IIR */
SetFilterPnlInputModes("11110111000000");
break;
case 1: /* HIGHPASS */
filtercode = 14; /* HP ELLIPTIC IIR */
SetFilterPnlInputModes("11110111000000");
break;
case 2: /* BANDPASS */
filtercode = 15; /* BP ELLIPTIC IIR */
SetFilterPnlInputModes("11111111000000");
break;
case 3: /* BANDSTOP */
filtercode = 16; /* BS ELLIPTIC IIR */
SetFilterPnlInputModes("11111111000000");
break;
} /* END OF SWITCH ON FILTERFUNC */
break;
} /* END OF SWITCH ON IIRTYPE */
break;
} /* END OF SWITCH ON FILTTYPE */
break;
case EVENT_RIGHT_CLICK:
MessagePopup ("Select Filter Function(필터 기능선택)",
"Selects between lowpass, highpass, bandpass, and bandstop filters.(저역통과, 고역통과, 대역통과, 대역정지 필터 사이에서 선택)");
break;
}
return 0;
}
int CVICALLBACK Returntomain (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_COMMIT:
HidePanel (filterpnl);
break;
case EVENT_RIGHT_CLICK:
MessagePopup ("Return to Main Screen(주화면으로 복귀)",
"Applies the chosen filter parameters and returns to the data acquisition screen.(선택된 필터 매개변수를 적용하고 데이터 획득 스크린으로 복귀)");
break;
}
return 0;
}
int CVICALLBACK ConfigureDaq (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_COMMIT:
DisplayPanel (daqpnl);
break;
case EVENT_RIGHT_CLICK:
MessagePopup ("Configure DAQ", "Displays and allows user to change acquisition parameters."("DAQ 구성", 사용자가 획득 매개변수를 디스플레이하고 변경하게 함));
break;
}
return 0;
}
int CVICALLBACK GetBoard (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_COMMIT:
GetCtrlVal (daqpnl, DAQPANEL_BOARD, &board);
break;
case EVENT_RIGHT_CLICK:
MessagePopup ("Set Board Number(보드 번호 설정)",
"Sets the data acquisition board number.(데이터 획득 보드 번호 설정)");
break;
}
return 0;
}
int CVICALLBACK Getchannel (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_COMMIT:
GetCtrlVal (daqpnl, DAQPANEL_CHANNEL, channel);
break;
case EVENT_RIGHT_CLICK:
MessagePopup ("Set Channel Number(채널 번호 설정)",
"Sets the channel number to acquire data from.(데이터 획득을 위한 채널 번호 설정)");
break;
}
return 0;
}
int CVICALLBACK Getsamprate (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_COMMIT:
GetCtrlVal (daqpnl, DAQPANEL_SAMPRATE, &samprate);
if (fircutoff1 > (samprate/2)) {
fircutoff1 = (samprate/2) 100;
SetCtrlVal (filterpnl, FILTERPNL_FIRCUTOFF1, fircutoff1);
}
if (fircutoff2 > (samprate/2)) {
fircutoff2 = (samprate/2);
SetCtrlVal (filterpnl, FILTERPNL_FIRCUTOFF2, fircutoff2);
}
if (iircutoff1 > (samprate/2)) {
iircutoff1 = (samprate/2) 100;
SetCtrlVal (filterpnl, FILTERPNL_IIRCUTOFF1, iircutoff1);
}
if (iircutoff2 > (samprate/2)) {
iircutoff2 = (samprate/2);
SetCtrlVal (filterpnl, FILTERPNL_IIRCUTOFF2, iircutoff2);
}
SetCtrlAttribute (filterpnl, FILTERPNL_FIRCUTOFF1, ATTR_MAX_VALUE,
(samprate/2));
SetCtrlAttribute (filterpnl, FILTERPNL_FIRCUTOFF2, ATTR_MAX_VALUE,
(samprate/2));
SetCtrlAttribute (filterpnl, FILTERPNL_IIRCUTOFF1, ATTR_MAX_VALUE,
(samprate/2));
SetCtrlAttribute (filterpnl, FILTERPNL_IIRCUTOFF2, ATTR_MAX_VALUE,
(samprate/2));
break;
case EVENT_RIGHT_CLICK:
MessagePopup ("Set Sampling Rate(샘플링 속도 설정)",
"Sets the sampling rate for acquiring data.(데이터 획득을 위한 샘플링 속도 설정)");
break;
}
return 0;
}
int CVICALLBACK Getpoints (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_COMMIT:
GetCtrlVal (daqpnl, DAQPANEL_POINTS, &points);
break;
case EVENT_RIGHT_CLICK:
MessagePopup ("Set Number of Points(포인트 수 설정)",
"Sets the number of points to acquire and analyze with each iteration.(각 반복으로 획득하고 분석할 포인트의 수 설정)");
break;
}
return 0;
}
int CVICALLBACK Quitdaqconf (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_COMMIT:
HidePanel (daqpnl);
if (running == 1)
{
if (signalswitch == 1) {
AIClearAcquisition (task);
AIStartAcquisition (board, channel, 2*points, samprate, 10, 0, &rate,&task);
}
}
break;
case EVENT_RIGHT_CLICK:
MessagePopup ("Return to Main Screen(주화면으로 복귀)",
"Applies the chosen acquisition parameters and returns to the main screen.(선택된 획득 매개변수를 적용하고 주화면으로 복귀)");
break;
}
return 0;
}
int CVICALLBACK Getdisplaymode (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_COMMIT:
GetCtrlVal (mainpnl, MAINPNL_FREQDISPLAY, &displaymode);
if (displaymode==1) {
SetInputMode (mainpnl, MAINPNL_SCALE, 0);
SetCtrlAttribute (mainpnl, MAINPNL_FREQGRAPH, ATTR_XNAME, "Time");
SetCtrlAttribute (mainpnl, MAINPNL_FREQGRAPH, ATTR_YNAME, "Volts");
SetCtrlAttribute (mainpnl, MAINPNL_FREQGRAPH, ATTR_LABEL_TEXT,
"Processed Time Waveform");
}
else {
SetInputMode (mainpnl, MAINPNL_SCALE, 1);
SetCtrlAttribute (mainpnl, MAINPNL_FREQGRAPH, ATTR_XNAME, "Hertz");
SetCtrlAttribute (mainpnl, MAINPNL_FREQGRAPH, ATTR_YNAME, "Magnitude");
SetCtrlAttribute (mainpnl, MAINPNL_FREQGRAPH, ATTR_LABEL_TEXT,
"Power Spectrum");
}
break;
case EVENT_RIGHT_CLICK:
MessagePopup ("Graph Display Selection(그래프 디스플레이 선택)",
"Selects between the processed time waveform or the frequency spectrum for display on the lower graph.(하단 그래프에 디스플레이하기 위해 처리된 시간 파형이나 주파수 스펙트럼 사이에서 선택)");
break;
}
return 0;
}
int CVICALLBACK Callhelp (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_COMMIT:
SetCtrlAttribute (mainpnl, MAINPNL_TIMER, ATTR_ENABLED, 0);
HidePanel (mainpnl);
DisplayPanel (helppnl);
break;
case EVENT_RIGHT_CLICK:
MessagePopup ("Help(도움말)",
"Displays help and information about the program.(프로그램에 관한 도움말 및 정보를 디스플레이)");
break;
}
return 0;
}
int CVICALLBACK Quithelp (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_COMMIT:
HidePanel (helppnl);
DisplayPanel (mainpnl);
if (running == 1)
{
SetCtrlAttribute (mainpnl, MAINPNL_TIMER, ATTR_ENABLED, 1);
if (signalswitch == 1) {
AIClearAcquisition (task);
AIStartAcquisition (board, channel, 2*points, samprate, 10, 0, &rate, &task);
}
}
break;
case EVENT_RIGHT_CLICK:
MessagePopup ("Exit Help(도움말을 빠져나옴)",
"Exits the help function and returns to the main panel.(도움말 기능을 빠져나와 주패널로 복귀)");
break;
}
return 0;
}
int CVICALLBACK Scalegraphs (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_COMMIT:
SetCtrlAttribute (mainpnl, MAINPNL_TIMER, ATTR_ENABLED, 0);
DisplayPanel (graphscalepnl);
break;
case EVENT_RIGHT_CLICK:
MessagePopup ("Graph Scale Settings(그래프 스케일 설정)",
"Allows user to set yaxis values for the graphs.(그래프에 대한 y축값을 사용자가 설정할 수 있음)");
break;
}
return 0;
}
int CVICALLBACK Getwaveformymin (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_COMMIT:
GetCtrlVal (graphscalepnl, SCALEPNL_WAVEFORMYMIN, &waveformymin);
if (waveformymin >= waveformymax) {
waveformymax = waveformymin + 1;
SetCtrlVal (graphscalepnl, SCALEPNL_WAVEFORMYMAX, waveformymax);
}
break;
case EVENT_RIGHT_CLICK:
MessagePopup ("Set Waveform Graph Y Axis Minimum(파형 그래프 y축 최소값 설정)",
"Sets the minimum value of the yaxis on the upper graph.(상단 그래프에서 y축의 최소값 설정)");
break;
}
return 0;
}
int CVICALLBACK Getwaveformymax (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_COMMIT:
GetCtrlVal (graphscalepnl, SCALEPNL_WAVEFORMYMAX, &waveformymax);
if (waveformymax <= waveformymin) {
waveformymax = waveformymin + 1;
SetCtrlVal (graphscalepnl, SCALEPNL_WAVEFORMYMAX, waveformymax);
}
break;
case EVENT_RIGHT_CLICK:
MessagePopup ("Set Waveform Graph Y Axis Maximum(파형 그래프 y축 최대값 설정)",
"Sets the maximum value of the yaxis on the upper graph.(상단 그래프에서 y축의 최대값 설정)");
break;
}
return 0;
}
int CVICALLBACK Getspectrumlinmin (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_COMMIT:
GetCtrlVal (graphscalepnl, SCALEPNL_SPECTRUMLINMIN, &spectrumlinmin);
if (spectrumlinmin >= spectrumlinmax) {
spectrumlinmax = spectrumlinmin + 1;
SetCtrlVal (graphscalepnl, SCALEPNL_SPECTRUMLINMAX, spectrumlinmax);
}
break;
case EVENT_RIGHT_CLICK:
MessagePopup ("Set Linear Scale Mode Y Axis Minimum(선형 스케일 모드 Y축 최소값 설정)",
"Sets the minimum value of the y axis on the lower graph for linear scale mode.(선형 스케일 모드에 대한 하단 그래프에서 y축의 최 소값 설정)");
break;
}
return 0;
}
int CVICALLBACK Getspectrumlinmax (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_COMMIT:
GetCtrlVal (graphscalepnl, SCALEPNL_SPECTRUMLINMAX, &spectrumlinmax);
if (spectrumlinmax <= spectrumlinmin) {
spectrumlinmax = spectrumlinmin + 1;
SetCtrlVal (graphscalepnl, SCALEPNL_SPECTRUMLINMAX, spectrumlinmax);
}
break;
case EVENT_RIGHT_CLICK:
MessagePopup ("Set Linear Scale Mode Y Axis Maximum(선형 스케일 모드 y축 최대값 설정)",
"Sets the maximum value of the y axis on the lower graph for linear scale mode.(선형 스케일 모드에 대한 하단 그래프에서 y축의 최대값 설정)");
break;
}
return 0;
}
int CVICALLBACK Getspectrumdbmin (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_COMMIT:
GetCtrlVal (graphscalepnl, SCALEPNL_SPECTRUMDBMIN, &spectrumdbmin);
if (spectrumdbmin >= spectrumdbmax) {
spectrumdbmax = spectrumdbmin + 1;
SetCtrlVal (graphscalepnl, SCALEPNL_SPECTRUMDBMAX, spectrumdbmax);
}
break;
case EVENT_RIGHT_CLICK:
MessagePopup ("Set dB Mode Y Axis Minimum(dB 모드 y축 최대값 설정)",
"Sets the minimum value of the yaxis for dB scale mode.(dB 스케일 모드에 대한 y축의 최소값 설정)");
break;
}
return 0;
}
int CVICALLBACK Getspectrumdbmax (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_COMMIT:
GetCtrlVal (graphscalepnl, SCALEPNL_SPECTRUMDBMAX, &spectrumdbmax);
if (spectrumdbmax <= spectrumdbmin) {
spectrumdbmax = spectrumdbmin + 1;
SetCtrlVal (graphscalepnl, SCALEPNL_SPECTRUMDBMAX, spectrumdbmax);
}
break;
case EVENT_RIGHT_CLICK:
MessagePopup ("Set dB Mode Y Axis Maximum(dB 모드 y축 최대값 설정)",
"Sets the maximum value of the yaxis for dB scale mode.(dB 스케일 모드에 대한 y축의 최대값 설정)");
break;
}
return 0;
}
/*****************************************************************/
int CVICALLBACK Getspectrumdbmmin (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_COMMIT:
GetCtrlVal (graphscalepnl, SCALEPNL_SPECTRUMDBMMIN, &spectrumdbmmin);
if (spectrumdbmmin >= spectrumdbmmax) {
spectrumdbmmax = spectrumdbmmin + 1;
SetCtrlVal (graphscalepnl, SCALEPNL_SPECTRUMDBMMAX, spectrumdbmmax);
}
break;
case EVENT_RIGHT_CLICK:
MessagePopup ("Set dBm Mode Y Axis Minimum(dB 모드 y축 최소값 설정)",
"Sets the minimum value of the yaxis for dBm scale mode.(dB 스케일 모드에 대한 y축의 최소값 설정)");
break;
}
return 0;
}
int CVICALLBACK Getspectrumdbmmax (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_COMMIT:
GetCtrlVal (graphscalepnl, SCALEPNL_SPECTRUMDBMMAX, &spectrumdbmmax);
if (spectrumdbmmax <= spectrumdbmmin) {
spectrumdbmmax = spectrumdbmmin + 1;
SetCtrlVal (graphscalepnl, SCALEPNL_SPECTRUMDBMMAX, spectrumdbmmax);
}
break;
case EVENT_RIGHT_CLICK:
MessagePopup ("Set dBm Mode Y Axis Maximum(dBm 모드 y축 최대값 설정)",
"Sets the maximum value of the yaxis for dBm scale mode.(dBm 스케일 모드에 대한 y축의 최대값 설정)");
break;
}
return 0;
}
int CVICALLBACK Gettimewavemin (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_COMMIT:
GetCtrlVal (graphscalepnl, SCALEPNL_TIMEWAVEMIN, &timewavemin);
if (timewavemin >= timewavemax) {
timewavemax = timewavemin + 1;
SetCtrlVal (graphscalepnl, SCALEPNL_TIMEWAVEMAX, timewavemax);
}
break;
case EVENT_RIGHT_CLICK:
MessagePopup ("Set Time Waveform Mode Y Axis Minimum(시간 파형 모드 y축 최소값 설정)",
"Sets the minimum value of the yaxis for Time Waveform display mode.(시간 파형 디스플레이 모드에 대한 y축의 최소값 설정)");
break;
}
return 0;
}
int CVICALLBACK Gettimewavemax (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_COMMIT:
GetCtrlVal (graphscalepnl, SCALEPNL_TIMEWAVEMAX, &timewavemax);
if (timewavemax <= timewavemin) {
timewavemax = timewavemin + 1;
SetCtrlVal (graphscalepnl, SCALEPNL_TIMEWAVEMAX, timewavemax);
}
break;
case EVENT_RIGHT_CLICK:
MessagePopup ("Set Time Waveform Mode Y Axis Maximum(시간 파형 모드 y축 최대값 설정)",
"Sets the maximum value of the yaxis for Time Waveform display mode.(시간 파형 디스플레이 모드에 대한 y축의 최대값 설정)");
break;
}
return 0;
}
int CVICALLBACK Quitgraphscaling (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_COMMIT:
HidePanel (graphscalepnl);
if (running == 1) {
SetCtrlAttribute (mainpnl, MAINPNL_TIMER, ATTR_ENABLED, 1);
}
break;
case EVENT_RIGHT_CLICK:
MessagePopup ("Exit Graph Scale Selection(그래프 스케일 빠져나감을 선택)",
"Exits the graph scaling mode and returns to main panel.(그래프 스케일 모드를 빠져나가 주패널로 복귀)");
break;
}
return 0;
}
int CVICALLBACK Getsignalswitch (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_COMMIT:
GetCtrlVal (daqpnl, DAQPANEL_SIGNALSWITCH, &signalswitch);
if (signalswitch == 0) {
SetInputMode (daqpnl, DAQPANEL_CHANNEL, 0);
SetInputMode (daqpnl, DAQPANEL_SAMPRATE, 0);
SetInputMode (daqpnl, DAQPANEL_SIMSIGNALTYPE, 1);
SetInputMode (daqpnl, DAQPANEL_SIMSIGNALFREQ, 1);
}
else {
SetInputMode (daqpnl, DAQPANEL_CHANNEL, 1);
SetInputMode (daqpnl, DAQPANEL_SAMPRATE, 1);
SetInputMode (daqpnl, DAQPANEL_SIMSIGNALTYPE, 0);
SetInputMode (daqpnl, DAQPANEL_SIMSIGNALFREQ, 0);
DisableBreakOnLibraryErrors ();
errorchk = Init_DA_Brds (board, &boardcode);
if (errorchk == 0) {
Set_DAQ_Device_Info (board, ND_DATA_XFER_MODE_AI, ND_UP_TO_1_DMA_CHANNEL);
if (running == 1) {
AIClearAcquisition (task);
AIStartAcquisition (board, channel, 2*points, samprate, 10, 0, &rate, &task);
}
}
else {
MessagePopup ("Board Configuration Error",
"The board you specified could not be configured. Please check the board number and configuration. The system has been reset to simulated data mode.(명시한 보드는 배치될 수 없으며, 따라서 보드 번호와 배치를 확인하세요. 시스템은 시뮬레이팅된 데이터 모드로 재설정되었습니다)");
signalswitch = 0;
SetCtrlVal (daqpnl, DAQPANEL_SIGNALSWITCH, signalswitch);
SetInputMode (daqpnl, DAQPANEL_CHANNEL, 0);
SetInputMode (daqpnl, DAQPANEL_SAMPRATE, 0);
SetInputMode (daqpnl, DAQPANEL_SIMSIGNALTYPE, 1);
SetInputMode (daqpnl, DAQPANEL_SIMSIGNALFREQ, 1);
}
}
break;
case EVENT_RIGHT_CLICK:
MessagePopup ("Select Data Source(데이터 소스 선택)",
"Selects between simulated data and data acquired from a DAQ board.(시뮬레이팅된 데이터와 DAQ 보드로부터 얻은 데이터 사이에서 선택)");
break;
}
return 0;
}
int CVICALLBACK Getsimsignaltype (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_COMMIT:
GetCtrlVal (daqpnl, DAQPANEL_SIMSIGNALTYPE, &simsignaltype);
break;
case EVENT_RIGHT_CLICK:
MessagePopup ("Select Simulated Wave Type.(시뮬레이팅된 파동 종류 선택)",
"Selects the simulated wave type.(시뮬레이팅된 파동 종류 선택)");
break;
}
return 0;
}
int CVICALLBACK Getsimsignalfreq (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_COMMIT:
case EVENT_VAL_CHANGED:
GetCtrlVal (daqpnl, DAQPANEL_SIMSIGNALFREQ, &simsignalfreq);
break;
case EVENT_RIGHT_CLICK:
MessagePopup ("Select Simulated Wave Frequency(시뮬레이팅된 파동 종류 선택)",
"Selects the frequency of the simulated wave data.(시뮬레이팅된 파동 데이터의 주파수 선택)");
break;
}
return 0;
}

Claims (13)

  1. UUT 입력 및 UUT 출력을 구비한 시험 유닛(UUT)으로부터 생성되는 신호들의 위상 잡음을 측정하기 위한 잡음 시험 측정 시스템에 있어서, 상기 시스템은,
    - 시험 유닛으로부터 신호들을 수신하기 위한 증폭기 입력과, 믹서에 연결하기 위한 증폭기 출력을 구비한 가변 증폭기,
    - 저잡음 신호를 발생시키기 위한 가변 저잡음 소스로서, 이때, 상기 저잡음 소스는 분리기를 포함하고, 상기 분리기는 상기 저잡음 신호를 제 1 출력으로 출력하기 위한 제 1 저잡음 신호와, 제 2 출력으로 출력하기 위한 제 2 저잡음 신호로 분리시키며, 상기 제 1 출력은 상기 UUT 입력에 연결되고, 상기 제 2 출력은 가변 위상 이동 장치에 연결되는 특징의 상기 가변 저잡음 소스,
    - 상기 가변 저잡음 소스의 상기 제 2 출력에 연결되는 위상 이동 장치 입력과, 믹서에 연결되는 위상 이동 장치 출력을 구비한 가변 위상 이동 장치로서, 상기 가변 저잡음 소스의 상기 제 2 출력으로부터 수신되는 상기 제 2 저잡음 신호의 위상을 조정하는 상기 가변 위상 이동 장치,
    - 제 1, 2 믹서 입력과 한개의 믹서 출력을 구비한 믹서로서, 이때, 상기 제 1 믹서 입력은 상기 증폭기 출력에 연결되고, 상기 제 2 믹서 입력은 상기 위상 이동 장치 출력에 연결되며, 상기 믹서 출력은 처리기에 연결되고, 상기 믹서는 동기식 위상 검출기를 포함하며, 상기 동기식 위상 검출기는 상기 제 1, 2 믹서 입력에서 수신한 신호들을 동기화하여 상기 믹서 출력으로부터 측정 시험 신호를 출력하는 특징의 상기 믹서,
    - 상기 믹서 출력에 연결되는 처리기 입력을 구비한 처리기로서, 상기 처리기는 상기 처리기를 상기 가변 증폭기, 상기 저잡음 소스, 그리고 상기 가변 위상 이동 장치에 연결하기 위한 제어 링크를 추가로 포함하여, 상기 위상 이동 장치 출력이 상기 증폭기 출력에 대해 동일 진폭 및 90도 위상차를 자동적으로 유지하도록 구성되는 상기 처리기
    를 포함하는 것을 특징으로 하는 잡음 시험 측정 시스템.
  2. 제 1 항에 있어서, 상기 시스템은,
    - 상기 믹서로부터 상기 측정 시험 신호 출력의 특성을 나타내는 이미지를 생성하기 위해 상기 처리기에 연결되는 표시 수단
    을 추가로 포함하는 것을 특징으로 하는 잡음 측정 시험 시스템.
  3. 제 2 항에 있어서, 상기 표시 수단이 스펙트럼 분석기를 포함하는 것을 특징으로 하는 잡음 측정 시험 시스템.
  4. 제 1 항에 있어서, 상기 시스템은,
    - 상기 믹서와 상기 처리기 사이에 연결된 아날로그-디지탈 변환기
    를 추가로 포함하는 것을 특징으로 하는 잡음 측정 시험 시스템.
  5. 제 1 항에 있어서, 상기 시스템은,
    - 상기 믹서와 상기 처리기 사이에 결합된 저잡음 정합 증폭기
    를 추가로 포함하는 것을 특징으로 하는 잡음 측정 시험 시스템.
  6. 제 5 항에 있어서, 상기 처리기는 상기 저잡음 정합 증폭기에 연결된 제어 링크를 포함하여, 상기 저잡음 정합 증폭기의 이득을 자동으로 조정하도록 함을 특징으로 하는 잡음 측정 시험 시스템.
  7. 제 5 항에 있어서, 상기 처리기는 상기 저잡음 정합 증폭기에 연결된 제어 링크를 포함하여, 상기 저잡음 정합 증폭기의 임피던스를 자동으로 조정하도록 함을 특징으로 하는 잡음 측정 시험 시스템.
  8. 제 1 항에 있어서, 상기 처리기는 상기 저잡음 소스의 동작을 자동으로 조정하여, 각기 달리 선택된 오프셋 주파수에서 상기 저잡음 신호를 발생시키도록 하며,
    상기 처리기는 또한 상기 증폭기 및 상기 위상 이동 장치를 자동으로 제어하여, 상기 믹서에 의해 수신된 신호들이 90도의 위상차를 가질 수 있도록 함을 특징으로 하는 잡음 측정 시험 시스템.
  9. 가변 증폭기, 가변 저잡음 소스, 가변 위상 이동 장치, 믹서, 비디오 표시 장치, 그리고, 처리기를 포함하는 시험 측정 시스템을 이용하여 시험 유닛(UUT)의 신호 잡음을 측정하는 방법에 있어서, 이때, 상기 처리기는 상기 증폭기, 상기 저잡음 소스, 그리고 상기 위상 이동 장치를 제어하기 위해 제어 링크를 포함하며, 상기 방법은,
    - 상기 처리기에 의해 결정되는 주파수를 가진 저잡음 신호를 상기 가변 저잡음 소스에 의해 발생시키는 단계,
    - 상기 저잡음 신호를 제 1 저잡음 반송파 신호와 제 2 저잡음 신호로 분리시키는 단계,
    - 상기 제 1 저잡음 반송파 신호를 상기 시험 유닛 및 상기 가변 증폭기를 통해 상기 믹서에 전달하는 단계,
    - 상기 제 2 저잡음 신호를 상기 가변 위상 이동 장치를 통해 상기 믹서에 전달하는 단계,
    - 상기 믹서로부터의 출력 신호를 상기 처리기까지 전달하는 단계
    - 상기 처리기로부터의 명령에 따라 상기 가변 증폭기와 상기 가변 위상 이동 장치를 조정하여, 상기 믹서에 의해 수신한 신호들을 90도 위상차 및 동일 진폭으로 유지시키는 단계
    를 포함하는 것을 특징으로 하는 시험 유닛의 신호 잡음 측정 방법.
  10. 삭제
  11. 삭제
  12. 삭제
  13. 삭제
KR1020017014649A 1999-05-17 2000-05-17 잡음 측정 검사 시스템 및 방법 KR100772838B1 (ko)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
US09/313,435 US6393372B1 (en) 1999-05-17 1999-05-17 Automated frequency stepping noise measurement system
US09/313,435 1999-05-17

Publications (2)

Publication Number Publication Date
KR20020044109A KR20020044109A (ko) 2002-06-14
KR100772838B1 true KR100772838B1 (ko) 2007-11-02

Family

ID=23215682

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020017014649A KR100772838B1 (ko) 1999-05-17 2000-05-17 잡음 측정 검사 시스템 및 방법

Country Status (11)

Country Link
US (1) US6393372B1 (ko)
EP (1) EP1204874B1 (ko)
JP (1) JP5073887B2 (ko)
KR (1) KR100772838B1 (ko)
AT (1) ATE276522T1 (ko)
AU (1) AU773393B2 (ko)
CA (1) CA2372800C (ko)
DE (1) DE60013855T2 (ko)
ES (1) ES2232455T3 (ko)
MX (1) MXPA01011752A (ko)
WO (1) WO2000070357A2 (ko)

Families Citing this family (20)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7035324B2 (en) * 2001-08-01 2006-04-25 Agilent Technologies, Inc. Phase-noise measurement with compensation for phase noise contributed by spectrum analyzer
KR20030044105A (ko) * 2001-11-28 2003-06-09 엘지이노텍 주식회사 위상 잡음 측정장치
US7079818B2 (en) * 2002-02-12 2006-07-18 Broadcom Corporation Programmable mutlistage amplifier and radio applications thereof
US6745020B2 (en) 2002-08-29 2004-06-01 Eugene Rzyski Direct downconversion receiver
US7155218B1 (en) * 2003-04-15 2006-12-26 Sprint Spectrum L.P. Method and system for determining spurious emission output by a wireless terminal
US6980915B2 (en) * 2004-03-23 2005-12-27 Agilent Technologies, Inc. Phase noise compensation for spectral measurements
US7035743B1 (en) * 2004-10-18 2006-04-25 Agilent Technologies, Inc. Phase noise compensation for phase noise measurements
US7693674B2 (en) * 2005-05-20 2010-04-06 Omniphase Research Laboratories, Inc. Low-noise source
US8965727B2 (en) * 2005-05-20 2015-02-24 Omniphase Research Laboratories, Inc. Intelligent low noise design
US7885632B2 (en) * 2005-05-20 2011-02-08 Omniphase Research Laboratories, Inc. Automated noise measurement system
JP4792340B2 (ja) * 2006-07-11 2011-10-12 株式会社アドバンテスト 試験装置および試験方法
US8269529B2 (en) 2010-01-14 2012-09-18 Advanced Testing Technologies, Inc. Low phase noise RF signal generating system and phase noise measurement calibrating method
US20110169545A1 (en) * 2010-01-14 2011-07-14 Shahen Minassian Low phase noise rf signal generating system and method for calibrating phase noise measurement systems using same
US8248297B1 (en) * 2011-04-11 2012-08-21 Advanced Testing Technologies, Inc. Phase noise measurement system and method
WO2014125736A1 (ja) * 2013-02-14 2014-08-21 ソニー株式会社 音声認識装置、および音声認識方法、並びにプログラム
US9500697B2 (en) * 2014-01-27 2016-11-22 ProPlus Design Solutions, Inc. Noise measurement system
KR101516341B1 (ko) * 2014-07-11 2015-05-04 (주)에스티앤씨 펄스 레이더 실시간 잡음지수 산출 방법 및 그 시스템
CN104122457B (zh) * 2014-07-15 2017-05-31 中国电子科技集团公司第四十一研究所 一种脉冲调制信号相位噪声测量装置及方法
CN107966620A (zh) * 2017-11-21 2018-04-27 中国电子科技集团公司第四十研究所 一种数字鉴频的相位噪声测量装置及方法
DE102018112092A1 (de) * 2018-01-10 2019-07-11 Infineon Technologies Ag Integrierte mehrkanal-hf-schaltung mit phasenerfassung

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO1989008848A1 (en) * 1988-03-18 1989-09-21 Hughes Aircraft Company Phase noise measurement system
US5412325A (en) * 1993-12-23 1995-05-02 Hughes Aircraft Company Phase noise measurement system and method
EP0747714A2 (en) * 1995-06-06 1996-12-11 HE HOLDINGS, INC. dba HUGHES ELECTRONICS Noise measurement test system
WO1997046890A1 (en) * 1996-05-31 1997-12-11 Poseidon Scientific Instruments Pty. Ltd. Interferometric signal processing apparatus
WO1999036793A1 (en) * 1998-01-14 1999-07-22 Advanced Testing Technologies, Inc. Phase noise measurement system

Family Cites Families (29)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
DE2803608C2 (de) 1978-01-27 1985-04-18 Wandel & Goltermann Gmbh & Co, 7412 Eningen Vierpolmeßverfahren und Schaltungsanordnung zu dessen Durchführung
US4336505A (en) * 1980-07-14 1982-06-22 John Fluke Mfg. Co., Inc. Controlled frequency signal source apparatus including a feedback path for the reduction of phase noise
US4580105A (en) 1985-01-25 1986-04-01 At&T Bell Laboratories Automatic reduction of intermodulation products in high power linear amplifiers
US4636747A (en) * 1985-03-11 1987-01-13 Ifr, Inc. System and method for wideband, continuous tuning of an oscillator
JPS6380626A (ja) 1986-09-24 1988-04-11 Yamaha Corp デイジタル・アナログ変換回路
US5524281A (en) 1988-03-31 1996-06-04 Wiltron Company Apparatus and method for measuring the phase and magnitude of microwave signals
GB2238195A (en) 1989-11-16 1991-05-22 Motorola Inc Feed forward amplifier with pilot tone cancellation
US5334946A (en) 1990-04-25 1994-08-02 British Technology Group Limited Apparatus and method for reducing distortion in amplification
GB9009295D0 (en) 1990-04-25 1990-06-20 Kenington Peter B Apparatus and method for reducing distortion in amplification
US5077532A (en) 1990-12-17 1991-12-31 Motorola, Inc. Feed forward distortion minimization circuit
US5119040A (en) 1991-01-04 1992-06-02 Motorola, Inc. Method and apparatus for optimizing the performance of a power amplifier circuit
JP3099979B2 (ja) * 1991-05-27 2000-10-16 日本電信電話株式会社 付加位相雑音測定方法および装置
JPH05249161A (ja) * 1992-03-09 1993-09-28 Toshiba Corp ジッタ測定装置
US5459680A (en) 1993-10-20 1995-10-17 The United States Of America As Represented By The Administrator Of The National Aeronautics And Space Administration Method and apparatus for spur-reduced digital sinusoid synthesis
US5365187A (en) 1993-10-29 1994-11-15 Hewlett-Packard Company Power amplifier utilizing the vector addition of two constant envelope carriers
US5455537A (en) 1994-08-19 1995-10-03 Radio Frequency Systems, Inc. Feed forward amplifier
US5493304A (en) 1994-09-29 1996-02-20 Hughes Aircraft Company Calibration system for wide band array using true-time-delay beamsteering
US5528196A (en) 1995-01-06 1996-06-18 Spectrian, Inc. Linear RF amplifier having reduced intermodulation distortion
US5619168A (en) 1995-08-07 1997-04-08 Lucent Technologies Inc. Distortion creation and reduction circuit
US5758275A (en) 1995-09-29 1998-05-26 Motorola, Inc. Method and apparatus for scheduling adaptation for a notch filter
US5621354A (en) 1995-10-17 1997-04-15 Motorola, Inc. Apparatus and method for performing error corrected amplification in a radio frequency system
US5623227A (en) 1995-10-17 1997-04-22 Motorola, Inc. Amplifier circuit and method of controlling an amplifier for use in a radio frequency communication system
US5742201A (en) 1996-01-30 1998-04-21 Spectrian Polar envelope correction mechanism for enhancing linearity of RF/microwave power amplifier
US5903819A (en) 1996-03-13 1999-05-11 Ericsson Inc. Noise suppressor circuit and associated method for suppressing periodic interference component portions of a communication signal
US5892397A (en) 1996-03-29 1999-04-06 Spectrian Adaptive compensation of RF amplifier distortion by injecting predistortion signal derived from respectively different functions of input signal amplitude
JP3297307B2 (ja) 1996-06-14 2002-07-02 沖電気工業株式会社 背景雑音消去装置
US5808512A (en) 1997-01-31 1998-09-15 Ophir Rf, Inc. Feed forward amplifiers and methods
US5886573A (en) 1998-03-06 1999-03-23 Fujant, Inc. Amplification using amplitude reconstruction of amplitude and/or angle modulated carrier
US6172564B1 (en) * 1999-07-30 2001-01-09 Eugene Rzyski Intermodulation product cancellation circuit

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO1989008848A1 (en) * 1988-03-18 1989-09-21 Hughes Aircraft Company Phase noise measurement system
US5412325A (en) * 1993-12-23 1995-05-02 Hughes Aircraft Company Phase noise measurement system and method
EP0747714A2 (en) * 1995-06-06 1996-12-11 HE HOLDINGS, INC. dba HUGHES ELECTRONICS Noise measurement test system
WO1997046890A1 (en) * 1996-05-31 1997-12-11 Poseidon Scientific Instruments Pty. Ltd. Interferometric signal processing apparatus
WO1999036793A1 (en) * 1998-01-14 1999-07-22 Advanced Testing Technologies, Inc. Phase noise measurement system

Also Published As

Publication number Publication date
CA2372800A1 (en) 2000-11-23
DE60013855D1 (de) 2004-10-21
JP5073887B2 (ja) 2012-11-14
ES2232455T3 (es) 2005-06-01
DE60013855T2 (de) 2005-09-22
MXPA01011752A (es) 2004-09-06
WO2000070357A3 (en) 2001-08-23
CA2372800C (en) 2011-01-11
JP2004500545A (ja) 2004-01-08
EP1204874B1 (en) 2004-09-15
EP1204874A2 (en) 2002-05-15
AU773393B2 (en) 2004-05-27
US6393372B1 (en) 2002-05-21
WO2000070357A2 (en) 2000-11-23
ATE276522T1 (de) 2004-10-15
AU5023900A (en) 2000-12-05
KR20020044109A (ko) 2002-06-14

Similar Documents

Publication Publication Date Title
KR100772838B1 (ko) 잡음 측정 검사 시스템 및 방법
US9300410B1 (en) Receiver calibration
US6567762B2 (en) Dynamic range extension apparatus and method
CN101166067B (zh) Cdma移动终端辐射杂散测试装置及方法
US3970795A (en) Measurement of noise in a communication channel
US6480006B1 (en) Method for measuring phase noise using a low noise synthesizer
US7034546B2 (en) Method and apparatus for measuring insertion loss of a conductor
US20050137814A1 (en) Method of measuring noise figure using arbitrary waveforms
US10551470B2 (en) Calibration apparatus, calibration system and method for calibrating at least one of the signal generator and a signal analyzer
JP4527939B2 (ja) 信号の測定
CN110704797A (zh) 实时频谱分析仪和信号处理方法、可读存储介质
KR100339642B1 (ko) 스웹트 헤테로다인 분석을 이용한 고주파 감시 시스템
US20090047918A1 (en) Mix and Match Preselector and RF Receiver
JP2765872B2 (ja) 信号対雑音比設定方法および信号対雑音比設定装置
KR102450699B1 (ko) 이더넷을 이용한 fm 송신기 자동 측정 방법
US3522391A (en) Transmission measuring method utilizing self-measuring techniques to determine transmission measurement errors due to imperfections of an automatic transmission measuring set
KR960014673B1 (ko) 코드분할다중접속방식(cdma)용 알에프(rf) 링크 시뮬레이션 장치
Gumm Measurement of 8-VSB DTV transmitter emissions
Schwarz et al. Understanding and Evaluating the Dynamic Range of Spectrum Analyzers.
KR100285544B1 (ko) 기지국의 rx 경로 측정장치
Sayegh et al. Measurement of Passive Intermodulation with Uncertainty Budget using a Vectorial-PIM System
CN116232495A (zh) 一种射频通道自动测试系统及方法
CN113109634A (zh) 天线测试方法、装置、终端设备、天线测试系统及介质
CN116032390A (zh) 发射信号调试方法、接收信号调试方法及其系统
Vozzo Performance assessment of receivers used in HF radar

Legal Events

Date Code Title Description
N231 Notification of change of applicant
A201 Request for examination
E902 Notification of reason for refusal
E701 Decision to grant or registration of patent right
GRNT Written decision to grant
G170 Re-publication after modification of scope of protection [patent]
FPAY Annual fee payment

Payment date: 20111031

Year of fee payment: 5

LAPS Lapse due to unpaid annual fee