0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

(TensorFlow による) フーリエ変換の実装に関するメモ

Last updated at Posted at 2018-07-11

ポイント

  • TensorFlow API の使い方を具体的な数値例で確認。

サンプルコード 1

fs = 800
frame_length = 128

a_1 = 0.5
a_2 = 1.0
a_3 = 1.5
f_1 = 40
f_2 = 60
f_3 = 120

sine_1 = a_1 * np.sin(2.0 * np.pi * np.arange(frame_length) * f_1 / fs)
sine_2 = a_2 * np.sin(2.0 * np.pi * np.arange(frame_length) * f_2 / fs)
sine_3 = a_3 * np.sin(2.0 * np.pi * np.arange(frame_length) * f_3 / fs)

signal = tf.convert_to_tensor(sine_1 + sine_2 + sine_3, dtype = tf.float32)
window = tf.contrib.signal.hamming_window(frame_length) 

signal_f_nw = tf.fft(tf.cast(signal, tf.complex64))
half_spectrum_nw = tf.abs(signal_f_nw[: frame_length//2 + 1])
signal_f = tf.fft(tf.cast(signal * window, tf.complex64))
half_spectrum = tf.abs(signal_f[: frame_length//2 + 1])

resyn_signal = tf.cast(tf.ifft(signal_f), tf.float32) / window

with tf.Session() as sess:
  sig = sess.run(signal)
  win = sess.run(window)
  spec_nw = sess.run(half_spectrum_nw)
  spec = sess.run(half_spectrum)
  resyn_sig = sess.run(resyn_signal)

fig = plt.figure(figsize = (13, 8))

ax1 = fig.add_subplot(2, 3, 1)
ax1.plot(sig)
ax1.set_title('Input signal')

ax2 = fig.add_subplot(2, 3, 2)
ax2.plot(win)
ax2.set_title('Hamming window')

ax3 = fig.add_subplot(2, 3, 3)
ax3.plot(win * sig)
ax3.set_title('Windowed signal')

ax4 = fig.add_subplot(2, 3, 4)
ax4.plot(spec_nw)
ax4.set_title('Spectrum (no window)')

ax5 = fig.add_subplot(2, 3, 5)
ax5.plot(spec)
ax5.set_title('Spectrum (with window)')

ax6 = fig.add_subplot(2, 3, 6)
ax6.plot(resyn_sig)
ax6.set_title('Resynthesized signal')

plt.show()

image.png

image.png

サンプルコード 2

frame_length = 28*28 

indices = np.random.choice(1000, 3)
signals = mnist.train.images[indices]
window = tf.contrib.signal.hamming_window(frame_length) 

signals_f = tf.fft(tf.cast(signals * window, tf.complex64))
half_spectrum = tf.abs(signals_f[:, : frame_length//2 + 1])

with tf.Session() as sess:
  spectrum = sess.run(half_spectrum)
  
fig = plt.figure(figsize = (7, 5))

ax1 = fig.add_subplot(3, 2, 1)
ax1.imshow(np.reshape(signals[0], [28, 28]), cmap = 'gray')
ax1.set_title('Image')
ax1.set_axis_off()

ax2 = fig.add_subplot(3, 2, 2)
ax2.plot(spectrum[0])
ax2.set_ylim(0, 100)
ax2.set_title('Spectrum')

ax3 = fig.add_subplot(3, 2, 3)
ax3.imshow(np.reshape(signals[1], [28, 28]), cmap = 'gray')
# ax3.set_title('Image')
ax3.set_axis_off()

ax4 = fig.add_subplot(3, 2, 4)
ax4.plot(spectrum[1])
ax4.set_ylim(0, 100)
# ax4.set_title('Spectrum')

ax5 = fig.add_subplot(3, 2, 5)
ax5.imshow(np.reshape(signals[2], [28, 28]), cmap = 'gray')
# ax5.set_title('Image')
ax5.set_axis_off()

ax6 = fig.add_subplot(3, 2, 6)
ax6.plot(spectrum[2])
ax6.set_ylim(0, 100)
# ax6.set_title('Spectrum')

plt.show()

image.png

サンプルコード 3

frame_length = 28

indices = np.random.choice(1000, 3)
signals = np.reshape(mnist.train.images[indices], [-1, frame_length, frame_length])
# window = tf.contrib.signal.hamming_window(frame_length) 

signals_f = tf.fft2d(tf.cast(signals, tf.complex64))
spectrum = tf.abs(signals_f) / frame_length ** 2

with tf.Session() as sess:
  spectrum = sess.run(spectrum)
  
fig = plt.figure(figsize = (3, 3))

ax1 = fig.add_subplot(3, 2, 1)
ax1.imshow(np.reshape(signals[0], [28, 28]), cmap = 'gray')
ax1.set_title('Image')
ax1.set_axis_off()

ax2 = fig.add_subplot(3, 2, 2)
ax2.imshow(np.reshape(spectrum[0], [28, 28]), cmap = 'Reds')
ax2.set_title('Spectrum')
ax2.set_axis_off()

ax3 = fig.add_subplot(3, 2, 3)
ax3.imshow(np.reshape(signals[1], [28, 28]), cmap = 'gray')
ax3.set_axis_off()

ax4 = fig.add_subplot(3, 2, 4)
ax4.imshow(np.reshape(spectrum[1], [28, 28]), cmap = 'Reds')
ax4.set_axis_off()

ax5 = fig.add_subplot(3, 2, 5)
ax5.imshow(np.reshape(signals[2], [28, 28]), cmap = 'gray')
ax5.set_axis_off()

ax6 = fig.add_subplot(3, 2, 6)
ax6.imshow(np.reshape(spectrum[2], [28, 28]), cmap = 'Reds')
ax6.set_axis_off()

plt.show()

image.png

サンプルコード 4

fs = 800
frame_length = 128
frame_step = 32

a_1 = 0.5
a_2 = 1.0
a_3 = 1.5
f_1 = 40
f_2 = 60
f_3 = 120

sine_1 = a_1 * np.sin(2.0 * np.pi * np.arange(frame_length) * f_1 / fs)
sine_2 = a_2 * np.sin(2.0 * np.pi * np.arange(frame_length) * f_2 / fs)
sine_3 = a_3 * np.sin(2.0 * np.pi * np.arange(frame_length) * f_3 / fs)

signal_1 = tf.convert_to_tensor(sine_1 + sine_2 + sine_3, dtype = tf.float32)

a_4 = 1.5
a_5 = 1.0
a_6 = 0.5
f_4 = 50
f_5 = 100
f_6 = 150

sine_4 = a_4 * np.sin(2.0 * np.pi * np.arange(frame_length) * f_4 / fs)
sine_5 = a_5 * np.sin(2.0 * np.pi * np.arange(frame_length) * f_5 / fs)
sine_6 = a_6 * np.sin(2.0 * np.pi * np.arange(frame_length) * f_6 / fs)

signal_2 = tf.convert_to_tensor(sine_4 + sine_5 + sine_6, dtype = tf.float32)

signals = tf.concat([signal_1, signal_2], axis = 0)

window = tf.contrib.signal.hann_window(frame_length) 

frames = tf.contrib.signal.frame(signals, frame_length = frame_length, frame_step = frame_step)
windowed_frames = window * frames

stfts = tf.contrib.signal.stft(signals, frame_length = frame_length, frame_step = frame_step, \
                               fft_length = frame_length)
magnitude_spectrograms = tf.abs(stfts)

# print (signals)
# print (frames)
# print (stfts)
# print (magnitude_spectrograms)

with tf.Session() as sess:
  signals = sess.run(signals)
  frames = sess.run(frames)
  magnitude_spectrograms = sess.run(magnitude_spectrograms)

fig_0 = plt.figure(figsize = (5, 3))

ax1 = fig_0.add_subplot(1, 1, 1)
ax1.plot(signals)
ax1.set_title('Input signal')


fig = plt.figure(figsize = (11, 7))

ax2 = fig.add_subplot(2, 5, 1)
ax2.plot(frames[0])
ax2.set_title('Frame 0')

ax3 = fig.add_subplot(2, 5, 2)
ax3.plot(frames[1])
ax3.set_title('Frame 1')

ax4 = fig.add_subplot(2, 5, 3)
ax4.plot(frames[2])
ax4.set_title('Frame 2')

ax5 = fig.add_subplot(2, 5, 4)
ax5.plot(frames[3])
ax5.set_title('Frame 3')

ax6 = fig.add_subplot(2, 5, 5)
ax6.plot(frames[4])
ax6.set_title('Frame 4')

ax7 = fig.add_subplot(2, 5, 6)
ax7.plot(magnitude_spectrograms[0])
ax7.set_ylim(0, 50)
ax7.set_title('Spectrograms 0')

ax8 = fig.add_subplot(2, 5, 7)
ax8.plot(magnitude_spectrograms[1])
ax8.set_ylim(0, 50)
ax8.set_title('Spectrograms 1')

ax9 = fig.add_subplot(2, 5, 8)
ax9.plot(magnitude_spectrograms[2])
ax9.set_ylim(0, 50)
ax9.set_title('Spectrograms 2')

ax10 = fig.add_subplot(2, 5, 9)
ax10.plot(magnitude_spectrograms[3])
ax10.set_ylim(0, 50)
ax10.set_title('Spectrograms 3')

ax11 = fig.add_subplot(2, 5, 10)
ax11.plot(magnitude_spectrograms[4])
ax11.set_ylim(0, 50)
ax11.set_title('Spectrograms 4')

plt.show()

image.png

image.png

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?