0
私はvDSP_conv
を使用して自己相関を実行しています。ほとんどの場合、うまくいきますが、たいていは出力配列にNaNを埋め込んでいます。vDSP_convは時々NANを返します
コード:
func corr_test() {
var pass = 0
var x = [Float]()
for i in 0..<2000 {
x.append(Float(i))
}
while true {
print("pass \(pass)")
let corr = autocorr(x)
if corr[1].isNaN {
print("!!!")
}
pass += 1
}
}
func autocorr(a: [Float]) -> [Float] {
let resultLen = a.count * 2 + 1
let padding = [Float].init(count: a.count, repeatedValue: 0.0)
let a_pad = padding + a + padding
var result = [Float].init(count: resultLen, repeatedValue: 0.0)
vDSP_conv(a_pad, 1, a_pad, 1, &result, 1, UInt(resultLen), UInt(a_pad.count))
return result
}
出力:
pass ...
pass 169
pass 170
pass 171
(lldb) p corr
([Float]) $R0 = 4001 values {
[0] = 2.66466637E+9
[1] = NaN
[2] = NaN
[3] = NaN
[4] = NaN
...
私はここで何が起こっているかわかりません。私は0パディングを正確に処理していると思います。なぜなら、もし私がいなければ、99%の正確な結果を得ているとは思わないからです。
アイデア?グラシアス。
文書Aは、ベクトルAが「少なくともN + P-1でなければならない」と言います。 Nは出力ベクトルの長さであり、Pはフィルタベクトルの長さであるため、配列をパディングする方法はおそらく間違っていますが、正しい方法が何であるかはまだ分かりません。 –