概要
DSP(Digital Signal Processor:デジタル信号処理プロセッサ)は、リアルタイムの信号処理演算に特化したプロセッサです。音声・画像・センサーデータなどの連続的なデータストリームを高速かつ効率的に処理するために設計されており、汎用マイコンとは異なる特殊な命令セット・メモリアーキテクチャを持ちます。
「DSP」という言葉は、専用DSPチップ(TI TMS320系・ADI SHARC系)を指す場合と、「デジタル信号処理技術」そのものを指す場合があります。また、ARM Cortex-M4のようにDSP拡張命令(積和演算・SIMD命令)を持つ汎用マイコンコアを「DSP機能付きマイコン」と呼ぶこともあります。
主なDSP用途:
- 音声処理: エコーキャンセル・ノイズリダクション・音声認識の前処理
- センサーフュージョン: IMU(加速度計+ジャイロ)データの統合
- モーター制御: FOC(磁界制御)のPID演算・スペクトル解析
- 通信処理: 変調・復調・誤り訂正
歴史・背景
DSPの歴史は1970年代に始まります。Bell Laboratoriesでデジタルフィルタ理論が発展し、1979年にAMDの Am2811とBell Labs S/360 DSP基板が登場。1982年にTexas InstrumentsがTMS32010を発売し、商用DSP市場の礎を築きました。
1980〜90年代はDSPが固定小数点演算主体で、音声コーデック(ADPCM・CELP)・モデム・携帯電話の音声処理で大量採用されました。AT&T/Lucent WE DSP16・Motorola 56000・Analog Devices ADSP-2100が代表製品です。
2000年代に入るとDSPとマイコンの境界が曖昧になり、Texas InstrumentsのMSP430(低消費電力マイコン)やARM Cortex-M4(DSP命令内蔵)のような「DSP機能付きマイコン」が普及。専用DSPチップは高性能・大規模信号処理(基地局・エンジン管理・ソナー・医療画像)向けに特化が進みました。
近年はNPU(AIアクセラレータ)がDSPの役割の一部(推論処理)を置き換えつつありますが、DSPは確定的レイテンシ・電力効率・アナログ周辺との統合において依然として重要な役割を持ちます。
技術仕様
DSP専用アーキテクチャの特徴
積和演算(MAC: Multiply-Accumulate)
DSP処理の中心はMAC演算(a += b × c)です。FIRフィルタ・FFT・行列積はすべてMAC命令の繰り返しで実現されます:
// FIRフィルタの核心(1タップ)
accumulator += coefficient[i] * input_sample[n - i]; // 1 MAC命令
専用DSPは1クロックサイクルで1 MAC(または複数MAC)を実行できます。汎用CPUでは乗算命令と加算命令の2命令が必要です。
ハーバードアーキテクチャ(デュアルデータバス)
DSPのハーバードアーキテクチャ:
CPU Core
├── 命令メモリバス → プログラムRAM
├── データバスA → データRAMA(係数)
└── データバスB → データRAMB(入力サンプル)
1クロックで: 係数の読み出し + サンプルの読み出し + MAC演算 を同時実行
飽和演算(Saturation Arithmetic)
// 通常の加算(オーバーフロー時に折り返し)
int16_t a = 30000, b = 10000;
int16_t c = a + b; // 40000 → 32767を超えて-25536に折り返す(音声がクリッピング)
// 飽和演算(クリッピングを防ぐ)
int16_t d = __QADD16(a, b); // ARM Cortex-M4 DSP命令
// 結果: 32767(INT16_MAX)に飽和(音声歪みを最小化)
ビットリバーサーレジスタ
FFT演算では入力データのビット逆順並び替え(ビットリバース)が必要です。DSPはハードウェアでビット逆順アドレッシングをサポートします。
ARM Cortex-M4/M7のDSP命令(SIMD)
ARM Cortex-M4以降のDSP命令(ARMv7-M DSP extension):
#include <arm_math.h> // CMSIS-DSP
#include <cmsis_compiler.h>
// SIMD 16ビット整数演算
int16_t a = 100, b = 200, c = 150, d = 250;
uint32_t simd_a = __PKHBT(a, b, 16); // a[15:0]:b[15:0]をパック
uint32_t simd_b = __PKHBT(c, d, 16); // c[15:0]:d[15:0]をパック
int32_t result = __SMLAD(simd_a, simd_b, 0); // a*c + b*d(2並列MAC)
// 16ビット飽和加算(音声処理)
uint32_t sat_add = __QADD16(simd_a, simd_b); // 4×8bit or 2×16bit飽和加算
CMSIS-DSPライブラリを使った高レベルAPI:
// FIRフィルタ(CMSIS-DSP)
arm_fir_instance_f32 fir;
float coeffs[NUM_TAPS], state[NUM_TAPS + BLOCK_SIZE - 1];
arm_fir_init_f32(&fir, NUM_TAPS, coeffs, state, BLOCK_SIZE);
arm_fir_f32(&fir, input_buffer, output_buffer, BLOCK_SIZE);
代表的なDSP製品スペック
| 製品 | ビット幅 | クロック | MACS/cycle | 用途 |
|---|---|---|---|---|
| TI TMS320C55x | 固定小数点16/32bit | ~300MHz | 2 | 携帯電話・音声 |
| TI C6748 | 浮動+固定小数点 | 456MHz | 4 | 産業制御・音声 |
| ADI SHARC+ | 32/40bit浮動小数点 | 450MHz | 8 | プロオーディオ |
| NXP DSP56800EX | 固定小数点 | 150MHz | 2 | 電源・モーター制御 |
| ARM Cortex-M4 | 32bit(DSP拡張) | 〜480MHz | 2 | 汎用IoT・センサー |
動作原理
FIRフィルタ(有限インパルス応答)
FIRフィルタはDSP処理の基本です。N次FIRフィルタの出力は:
y[n] = Σ(k=0 to N-1) h[k] × x[n-k]
y[n]: 現在の出力
h[k]: フィルタ係数(タップ係数)
x[n-k]: N個前の入力サンプル
C実装(非最適化):
float fir_filter(float *x, const float *h, int N, int n) {
float y = 0.0f;
for (int k = 0; k < N; k++) {
y += h[k] * x[(n - k + BUFFER_SIZE) % BUFFER_SIZE];
}
return y;
}
CMSIS-DSP(Cortex-M4最適化)版では、同じ処理がDSP命令を使って数倍高速化されます。
FFT(高速フーリエ変換)
FFTは信号を時間領域から周波数領域に変換します。N点DFTの計算量O(N²)をFFTでO(N log N)に削減:
// CMSIS-DSPでのFFT(256点)
arm_rfft_fast_instance_f32 fft;
arm_rfft_fast_init_f32(&fft, 256);
float input[256]; // 時間領域サンプル(256個)
float output[256]; // 周波数領域(実部・虚部が交互)
arm_rfft_fast_f32(&fft, input, output, 0); // 0=フォワードFFT
// 周波数成分(絶対値)の計算
float magnitude[128];
arm_cmplx_mag_f32(output, magnitude, 128);
// 最大周波数成分の検出
float max_val;
uint32_t max_idx;
arm_max_f32(magnitude, 128, &max_val, &max_idx);
float dominant_freq = max_idx * SAMPLE_RATE / 256.0f; // Hz
IIRフィルタ(無限インパルス応答)
IIRフィルタはFIRより少ないタップで急峻な特性が実現できますが、不安定になるリスクがあります:
// バイクワッド(2次IIR)フィルタ(Direct Form II)
typedef struct {
float b0, b1, b2; // フィードフォワード係数
float a1, a2; // フィードバック係数
float w1, w2; // 内部状態
} Biquad;
float biquad_process(Biquad *f, float x) {
float w0 = x - f->a1 * f->w1 - f->a2 * f->w2;
float y = f->b0 * w0 + f->b1 * f->w1 + f->b2 * f->w2;
f->w2 = f->w1;
f->w1 = w0;
return y;
}
用途・ユースケース
音声処理・VoIP
マイクからの音声信号に対して:
- ノイズゲート: 一定レベル以下の音を除去
- エコーキャンセラ: スピーカーからの回り込みを除去(LMSアダプティブフィルタ)
- AEC(Acoustic Echo Cancellation): Web会議・スマートスピーカーで必須
- ビームフォーミング: マイクアレイで指向性を制御
モーター制御(FOC)
三相ブラシレスモーター(BLDC・PMSM)のFOC(Field Oriented Control:磁界制御)では:
- クラーク変換・パーク変換(αβ→dq座標変換)
- PID制御演算
- 逆パーク変換・SVPWM生成
これらすべての三角関数・行列演算をリアルタイム(数十µs周期)で行うためDSP命令が有効です。
センサーフュージョン
IMU(IMU)からの加速度計・ジャイロデータをカルマンフィルタや相補フィルタで統合して姿勢推定を行います:
// 相補フィルタ(簡易センサーフュージョン)
float alpha = 0.98f; // ジャイロの重み
float angle = alpha * (angle + gyro_rate * dt)
+ (1.0f - alpha) * accel_angle;
通信処理
OFDM(Wi-Fi・LTE)の変調・復調はFFT/IFFTが核心であり、DSP or NPUが使われます。GNSS受信機(GPS)の相関処理もDSPの典型的用途です。
実装・開発のポイント
固定小数点 vs 浮動小数点
組み込みDSPでは計算精度と速度のトレードオフがあります:
// 浮動小数点(32bit float)
float x = 3.14159265f; // 高精度・Cortex-M4 FPUなら1サイクル
float y = arm_sin_f32(x); // CMSIS-DSPのsin
// 固定小数点(Q1.15形式:1符号ビット+15小数ビット)
// Q15での1.0 = 32767 (0x7FFF)
int16_t x_q15 = 10000; // ≈ 0.305 * 32768
int16_t y_q15;
arm_sin_q15(x_q15, &y_q15); // 固定小数点版(FPUなしでも高速)
CMSIS-DSPの活用
# CMSIS-DSPをCMakeプロジェクトに追加
git submodule add https://github.com/ARM-software/CMSIS-DSP.git
add_subdirectory(CMSIS-DSP/Source)
target_link_libraries(myapp CMSISDSP)
target_compile_definitions(myapp PRIVATE
ARM_MATH_CM4 # Cortex-M4
ARM_MATH_MATRIX_CHECK
ARM_MATH_ROUNDING
)
DMAと組み合わせたDSP処理
リアルタイム音声処理ではDMAを使って継続的なADC→DSP→DACパイプラインを構築します:
// ダブルバッファリングでCPUなしにADCデータを収集
uint16_t adc_buf[2][BLOCK_SIZE]; // ダブルバッファ
// DMAの半分転送割り込みで片側バッファを処理
void DMA_Stream_IRQHandler(void) {
if (half_transfer) {
process_audio(adc_buf[0]); // バッファ0を処理中にバッファ1をDMAが書き込み
} else {
process_audio(adc_buf[1]); // バッファ1を処理中にバッファ0をDMAが書き込み
}
}
他技術との比較
DSP vs 汎用マイコン(Cortex-M)
| 項目 | 専用DSP(TMS320系) | Cortex-M4(DSP命令付) |
|---|---|---|
| MAC速度 | 最高(2〜8 MAC/cycle) | 高い(2 MAC/cycle) |
| 汎用性 | 低い(信号処理特化) | 高い(汎用+DSP) |
| 開発環境 | CCS(TI専用) | 標準ARM環境 |
| コスト | 高い | 低い |
| メモリ | ハーバード(デュアルRAM) | 標準 |
新規設計では専用DSPより「Cortex-M4/M7 + CMSIS-DSP」の組み合わせが増えています。
DSP vs NPU
NPU(AIアクセラレータ)はニューラルネットワーク推論(行列積・活性化関数)に特化しており、従来のDSPが得意とした数値信号処理(FIR・FFT・PID)との住み分けがあります。エッジAI機器では両者を組み合わせ、DSPでセンサー前処理→NPUで推論という構成が増えています。