我试图在张量流中创建一个用于音频处理的real-fft函数。这涉及去除fft的上半部分,因为使用实数,fft的上半部分恰好是底部的反向复共轭。当我试图创建逆实数fft时,我需要反转复数的序列,取共轭,然后将其连接到原始的复数张量。当我这样做时,我得到一个错误,说反向操作不支持类型complex64。因此,我必须按照以下tf.conj(tf.complex(tf.reverse(tf.real(x), dims = (False, True)), tf.reverse(tf.imag(x), dims = (False, True)))))
实施它。
这似乎有点低效,就像黑客一样。是否有任何理由不应该支持复杂类型的逆转,或者它只是开发人员忘记包含的内容?还有更好的方法吗?
这是我的完整irfft功能,可以批量操作。输入不存储为复杂类型。它以[re0,re2 ...,reN,im0,im1,...,imN]格式存储
def irfft(x):
x = tf.cast(x, tf.float32)
x = tf.complex(x[:, :x.get_shape()[-1].value // 2], x[:, x.get_shape()[-1].value // 2:])
x = tf.concat(1, (x, tf.conj(tf.complex(tf.reverse(tf.real(x), dims = (False, True)), tf.reverse(tf.imag(x), dims = (False, True))))))
return tf.real(tf.batch_ifft(x[:, :x.get_shape()[-1].value - 1]))