実現したいこと
マイクの入力にハイパスフィルタをかけたいです。
前提
Pythonを用いてマイクの入力をpyaudioで受けて、numpyを用いて離散フーリエ変換する事で、
ローパスフィルタをかけようとしています。
発生している問題
後述のように、フーリエ変換を少しでも変更するとノイズが発生します。
これは離散フーリエ変換の性質なのか、問題が発生しているのかわかりません。
フーリエ変換の性質の場合、音声にフィルタをかけるためには何が必要でしょうか。
該当のソースコード
Python
1import pyaudio 2import numpy as np 3import math 4import matplotlib as mpl 5import matplotlib.pyplot as plt 6 7 8def audio_trans(inp): 9 """ 10 w = np.zeros(512, dtype=float) 11 for i in range(512): 12 w[i] = (math.cos(i / 512 * math.pi * 2 - math.pi) + 1) * 0.5 13 """ 14 # data size 15 aaa = 512 * 2 * 2 16 # passing frequency 17 freq = 0 18 19 ''' 20 f = np.fft.rfftfreq(2048, 1 / 44100) 21 x = np.arange(1025) 22 y = np.arange(512) 23 plt.plot(x, cv_data.imag, color="cyan", alpha=1) 24 plt.plot(x, cv_data.real, color="red", alpha=0.5) 25 plt.show() 26 ''' 27 # fourier transforming 28 fft_data = np.fft.rfft(inp, aaa) 29 30 # editing coefficients 31 cv_data = np.zeros(aaa // 2 + 1, dtype=np.complex_) 32 for i in range(aaa // 2 + 1 - freq): 33 cv_data[i] = fft_data[i] 34 35 # invert fourier transforming 36 fft_data2 = np.fft.irfft(cv_data, aaa) 37 38 # era-kaihi 39 fft_data3 = np.real(fft_data2) 40 fft_data4 = np.zeros(aaa, dtype=int) 41 for num in range(aaa): 42 fft_data4[num] = int(fft_data3[num]) 43 44 ret = np.array(fft_data4) 45 46 return ret 47 48 49def main(): 50 CHUNK = 1024 51 RATE = 44100 52 p = pyaudio.PyAudio() 53 54 stream = p.open(format=pyaudio.paInt16, 55 channels=1, 56 rate=RATE, 57 frames_per_buffer=CHUNK, 58 input_device_index=1, 59 output_device_index=10, 60 input=True, 61 output=True) 62 63 while stream.is_active(): 64 st_input = stream.read(CHUNK) 65 data = np.frombuffer(st_input, dtype='int32') 66 67 # to editor 68 data2 = audio_trans(data) 69 70 input2 = np.frombuffer(data2, dtype='int32') 71 output = stream.write(input2) 72 73 stream.stop_stream() 74 stream.close() 75 p.terminate() 76 77 print 78 'Stop Streaming' 79 80 81if __name__ == '__main__': 82 main()
試したこと
freqを0にする、つまりフーリエ変換に変更を加えないと、望んだ音が返ってきました。
フーリエ変換の値の一部を0にすると、周波数に依存するノイズが発生しました。
値を1000000+1000000j減算してもノイズが発生しました。
値を2で除算してもノイズが発生しました。
有意に変更を加えると正しい音声にならない?
補足情報(FW/ツールのバージョンなど)
IntelliJ IDEA 2021.3.3 (Community Edition)
Build #IC-213.7172.25, built on March 16, 2022
Runtime version: 11.0.14.1+1-b1751.46 amd64
VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o.
回答3件
あなたの回答
tips
プレビュー