読者です 読者をやめる 読者になる 読者になる

Pebble's Diary

プログラマーの作業メモ

iOS/MacOSXのvDSP関数、多すぎてなかなか見つけられないのをなんとかする(応答編)

複素数を扱うためにvDSP.hで定義された構造体

typedef struct DSPComplex {
    float  real;
    float  imag;
} DSPComplex;

typedef struct DSPSplitComplex {
    float  * __nonnull realp;
    float  * __nonnull imagp;
} DSPSplitComplex;

1次元高速フーリエ変換

vDSP_create_fftsetup
vDSP_destroy_fftsetup

1次元高速フーリエ変換(In-Place Real)

vDSP_fft_zrip       テンポラリバッファ未使用
vDSP_fft_zript      テンポラリバッファ使用
vDSP_fftm_zrip      複数信号,テンポラリバッファ未使用
vDSP_fftm_zript     複数信号,テンポラリバッファ使用

vDSP_fft_zripの引数

vDSP_Length Log2N -> 要素数を2の何乗かで指定します。要素数が1024なら210=1024なので10を指定します。
FFTDirection
Direction -> kFFTDirection_Forward: フーリエ変換, kFFTDirection_Inverse : 逆変換

<vDSP独自仕様>
1次元で正変換の場合、スケーリングは1。 1次元で逆変換の場合、スケーリングがN。つまり値がN倍された値が返ってくるので、Nで割って使う。
要素Nのデータを処理する場合、log2(N) + 1 = log2(N*2)を指定する必要がある。

参考: Using Fourier Transforms

1次元高速フーリエ変換(Out-of-Place Real)

vDSP_fft_zrop       テンポラリバッファ未使用
vDSP_fft_zropt      テンポラリバッファ使用
vDSP_fftm_zrop      複数信号,テンポラリバッファ未使用
vDSP_fftm_zropt     複数信号,テンポラリバッファ使用

1次元高速フーリエ変換(固定長)

vDSP_FFT16_copv     16要素 interleaved
vDSP_FFT32_copv     32要素 interleaved
vDSP_FFT16_zopv     16要素 split
vDSP_FFT32_zopv     32要素 split

2次元高速フーリエ変換(In-Place Real)

vDSP_fft2d_zrip
vDSP_fft2d_zript

2次元高速フーリエ変換(Out-of-Place Real)

vDSP_fft2d_zrop
vDSP_fft2d_zropt

離散フーリエ変換

vDSP_DFT_zop_CreateSetup
vDSP_DFT_zrop_CreateSetup
vDSP_DFT_DestroySetup
vDSP_DFT_Execute

離散コサイン変換

vDSP_DCT_CreateSetup
vDSP_DCT_Execute

相関,畳み込み

vDSP_conv           2つの実ベクターの相関または畳み込み
vDSP_zconv          2つの複素ベクターの相関または畳み込み
vDSP_wiener         ウィーナフィルタとして使えるFIRフィルタの生成
vDSP_desamp         デシメーション,アンチエイリアスするFIRフィルタ
vDSP_zrdesamp       デシメーション,アンチエイリアスするComplex-real FIRフィルタ
vDSP_f3x3           3x3カーネルでの2次元畳み込みで画像をフィルタ
vDSP_f5x5           5x5カーネルでの2次元畳み込みで画像をフィルタ
vDSP_imgfir         1カーネルでの2次元畳み込みで画像をフィルタ

ウィンドウ

vDSP_blkman_window
vDSP_hamm_window
vDSP_hann_window

単一チャネル4次IIRフィルタ

vDSP_biquad_CreateSetup
vDSP_biquad_DestroySetup
vDSP_biquad

複数チャネル4次IIRフィルタ

vDSP_biquadm_CreateSetup
vDSP_biquadm_DestroySetup
vDSP_biquadm_ResetState
vDSP_biquadm_SetActiveFilters
vDSP_biquadm_SetCoefficientsSingle
vDSP_biquadm_SetCoefficientsDouble
vDSP_biquadm_SetTargetsSingle
vDSP_biquadm_SetTargetsDouble
vDSP_biquadm_biquadm

複素ベクター変換

vDSP_ctoz   DSPComplex から DSPSplitComplex へ変換
vDSP_ztoc   DSPSplitComplex から DSPSplitComplex へ変換

floatから24ビット整数への変換

vDSP_vsmfix24
vDSP_vsmfixu24
vDSP_vflt24
vDSP_vfltu24
vDSP_vfltsm24
vDSP_vfltsmu24