Pebble Coding

ソフトウェアエンジニアによるIT技術、数学の備忘録

2次のIIRフィルタの周波数特性をDesmosで表示してみる

IIRフィルタの周波数特性の説明についてはこちらがわかりやすかったです。

デジタルフィルタの実装入門とアナログフィルタとの関係 | Haratta Tech Lab

2次のIIRフィルタの周波数特性は結局のところ伝達関数の複素数の絶対値をシータ(0からパイ)の関数としてグラフ化すれば良いのだと分かります。 作ってみたのがこちら。 複素数モードというのを使うのがミソでした。

www.desmos.com

LowPassFilterになっているのが分かります。 変数をグリグリ動かしてみると、HighPassFilterになったり、特定の周波数部分を上げたり下げたりするようなフィルターになっているのがわかります。 欲しい周波数特性を得るにはパラメータをどうやって設定したらいいのか分かりませんが、やり方はあるようです。 この記事ではここまでとします。

std::shared_ptrでmutexによってロックされる操作一覧

shared_ptr atomic_load(const shard_ptr p)
shared_ptr atomic_load_explicit(const shared_ptr
p, memory_order)
void atomic_store(shared_ptr p, shared_ptr r)
void atomic_store_explicit(shared_ptr
p, shared_ptr r, memory_order)
shared_ptr atomic_exchange(shared_ptr p, shared_ptr r)
shared_ptr atomic_exchange_explicit(shared_ptr
p, shared_ptr r, memory_order)
bool atomic_compare_exchange_strong(shared_ptr p, shared_ptr v, shared_ptr w)
bool atomic_compare_exchange_weak(shared_ptr p, shared_ptr v, shared_ptr w)
bool atomic_compare_exchange_strong_explicit(shared_ptr p, shared_ptr v, shared_ptr w, memory_order, memory_order)
bool atomic_compare_exchange_weak_explicit(shared_ptr p, shared_ptr v, shared_ptr w, memory_order, memory_order)

C++リファクタリングTIPS

  • 不要なthis経由のメソッド呼び出しのthisは取り除こう。

  • クラス名、構造体名の最後がInfo,DataならInfo,Dataは削除してOK。

  • 役割がほぼ値オブジェクトなのにclassになっているものはstructに変更し、参照部分はconst参照に変更できないか検討しよう。

  • friendの利用が適切か検討しよう。friendが必要なケースはものすごく限られるはず。

  • クラス内クラスはクラスの外に出そう。

  • namespaceの運用が適切か検討しよう。

Obfuscationテクニック

Obfuscationについて書かれた書籍は日本語ではほとんどないが広い範囲でテクニックがある。使用する言語や条件によって様々である。一覧にしておく。  
- 変数名、メソッド、クラス名のリネーム。

言語によってコンパイル時になくなってしまうものとそうでないものがある。

-  パッキング
コードを動的に圧縮することで一手間をかけさせる。

- 制御フロー
このロジックをトレースしづらくする。

- 指示パターン変換
コンパイラによって生成されるコードを通常とは異なるものにする。

- 数学、ロジック表現変換
シンプルな数学、ロジック表現を複雑で同等なものに置き換える。

- ダミーコード挿入
リバースエンジニアリング時のコード理解を邪魔する。

- メタデータ、未使用コード削除
ヒントとなる情報を攻撃者に与えない。

- バイナリリンク
複数のライブラリを一つのバイナリにすることで、得られる情報を少なくする。

- Opaque Predicate
常に成立する条件をif文に用いることでフロー解析を邪魔する。
例えば、
2つの連続する整数をかけたものは2で割り切れる。
3つの連続する整数をかけたものは3で割り切れる。

- 文字列の暗号化
バイナリ内の文字列を隠すため暗号化を行う。

- コード転置
ルーチンを並び替える

 

vDSPのフィルター機能(FIR,IIR)

FIR(Finite Inpluse Response) フィルター

実float FIR

vDSP_desamp(
    const float * A,    // real input vector A のサイズは DF * (N-1) + P 以上
    vDSP_Stride DF,     // Decimation factor
    const float * F,    // real filter vector
    float * C,          // real output vector
    vDSP_Length N,      // length of output vector c
    vDSP_Length P);     // length of filter F

for (int n = 0; n < N; ++n)
{
    float sum = 0;
    for (int p = 0; p < P; ++p) {
        sum += A[n * DF + p] * F[p];
    }
    C[n] = sum;
}

複素float FIR

void vDSP_zrdesamp(
  const DSPSplitComplex *A,
  vDSP_Stride DF,
  const float *F,
  const DSPSplitComplex *C,
  vDSP_Length N,
  vDSP_Length P);

for (int n = 0; n < N; ++n) {
    sum = 0;
    for (p = 0; p < P; ++p)
        sum += A[n*DF+p] * F[p];
    C[n] = sum;
}

IIR(Infinite Inpulse Response)フィルター2次

void vDSP_deq22(
  const float *A,    // real input vector
  vDSP_Stride IA,    // stride for A
  const float *B,    // 5 inputs (filter coefficients), with stride 1
  float *C,          // output vector
  vDSP_Stride IC,    // stride for C
  vDSP_Length N);    // number of new output elements to produce
C[n] = A[n  ] * B[0]
     + A[n-1] * B[1]
     + A[n-2] * B[2]
     - C[n-1] * B[3]  
     - C[n-2] * B[4] 
n = {2, N+1}