一定周波数のサイン波は通常は次のように書かれます:
ここで:![]()
- f は周波数 [Hz]
- t は時間 [秒]
- 2πft 角周波数 [rad]
周波数が時間とともに変わる周波数スイープと呼ばれる場合には次のようになります:
![]()
ここでθ(t) 時刻 t における角度(位相)で、それは瞬時周波数 f(t) を積分することにより得られます:
![]()
リニアスイープでは、周波数は f0 から f1 に時間 tt とともに直線的に変化します。 その瞬時周波数は次式で与えられます:
![]()
これを積分することで位相が得られます:
![]()
従って、リニアスイープの信号は次のように表されます:
![]()
対数(あるいは指数)スイープでは周波数が時間とともに指数的に変化します:
![]()
r = f1 / f0 と置くと、 積分により位相がえられます:
![]()
従って対数スイープの信号は次のように表されます:
![]()
重要な関係は次のものです:
![]()
この仕組みにより、信号解析やシステム同定や音響測定において不可欠な、 時間とともに周波数が変化する正弦波信号を構築することができます。
![]()
Fig. 1: 対数スイープ、固定、リニアスイープの波形
Listing 1
sine_sweep - sine-wave frequency sweep. in C89 (ANSI-C)/* sine_sweep : Sinusoidal wave frequency sweep * Rev.1.0 (Oct. 18, 2012) (c) 2012 Takayuki Hosoda */ #include <math.h> #define SWEEP_LIN 0 #define SWEEP_LOG 1 double sine_sweep(double t, double tt, double f0, double f1, int opt); double sine_sweep(t, tt, f0, f1, opt) double t; /* time */ double tt; /* sweep time */ double f0; /* start frequency */ double f1; /* stop frequency */ int opt; { if (opt == SWEEP_LOG) { return sin(2 * M_PI * tt * f0 / log(f0 / f1) * (pow(f1 / f0, (t / tt)) - 1.0)); } else { return sin(2 * M_PI * ((f1 - f0) * t * t / (2 * tt) + f0 * t)); } } #ifdef DEBUG #include <stdio.h> int main() { int t; double tt = 10000; double fclk = 10e6; /* 0 - 10000 500kHz..20kHz log sweep */ for (t = 0; t < 10000; t++) { printf("%d\t%.16g\t%.16g\t%.16g\n", t, sine_sweep((double)(t)/fclk, 10000/fclk, 500e3, 20e3, SWEEP_LOG), sine_sweep((double)(t)/fclk, 10000/fclk, 500e3, 20e3, SWEEP_LIN), sin(2*M_PI*t*100e3/fclk)); } return 0; } #endif