質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

708閲覧

python sliceエラー

sibazyun

総合スコア18

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/07/19 00:27

前提・実現したいこと

Pythonでローパスフィルタを作成しようとしたところ以下のようなエラーメッセージが発生してしまいました。

発生している問題・エラーメッセージ

Traceback (most recent call last): File "/Users/matsumura/PycharmProjects/wave/bandstopFIR.py", line 93, in <module> fft(b, fs) File "/Users/matsumura/PycharmProjects/wave/bandstopFIR.py", line 33, in fft plot(freqList[:n], amplitudeSpectrum[:n], linestyle='-') TypeError: slice indices must be integers or None or have an __index__ method

該当のソースコード

python

1#coding:utf-8 2import wave 3import struct 4import numpy as np 5from pylab import * 6 7def sinc(x): 8 if x == 0.0: return 1.0 9 else: return np.sin(x) / x 10 11def fft(x, fs): 12 start = 0 13 N = 512 # FFTのサンプル数 14 15 # 最低、N点ないとFFTできないので0.0を追加 16 for i in range(N): x.append(0.0) 17 18 X = np.fft.fft(x[start:start+N]) 19 freqList = np.fft.fftfreq(N, d=1.0/fs) 20 21 amplitudeSpectrum = [np.sqrt(c.real ** 2 + c.imag ** 2) for c in X] 22 23 # 波形を描画 24 subplot(211) 25 plot(range(start, start+N), x[start:start+N]) 26 axis([start, start+N, -0.5, 0.5]) 27 xlabel("time [sample]") 28 ylabel("amplitude") 29 30 # 振幅スペクトルを描画 31 subplot(212) 32 n = len(freqList) / 2 # FFTの結果は半分まで見ればOK 33 plot(freqList[:n], amplitudeSpectrum[:n], linestyle='-') 34 axis([0, fs/2, 0, 2]) 35 xlabel("frequency [Hz]") 36 ylabel("amplitude spectrum") 37 38 show() 39 40def createLPF(fe, delta): 41 """ローパスフィルタを設計、fe:エッジ周波数、delta:遷移帯域幅""" 42 # 遷移帯域幅を満たすフィルタ係数の数を計算 43 # N+1が奇数になるように調整が必要 44 N = round(3.1 / delta) - 1 45 if (N + 1) % 2 == 0: N += 1 46 N = int(N) 47 48 # フィルタ係数を求める 49 b = [] 50 for i in range(-N//2, N//2 + 1): 51 b.append(2.0 * fe * sinc(2.0 * math.pi * fe * i)) 52 53 # ハニング窓関数をかける(窓関数法) 54 hanningWindow = np.hanning(N + 1) 55 for i in range(len(b)): 56 b[i] *= hanningWindow[i] 57 58 return b 59 60def fir(x, b): 61 """FIRフィルタをかける、x:入力信号、b:フィルタ係数""" 62 y = [0.0] * len(x) # フィルタの出力信号 63 N = len(b) - 1 # フィルタ係数の数 64 for n in range(len(x)): 65 for i in range(N+1): 66 if n - i >= 0: 67 y[n] += b[i] * x[n - i] 68 return y 69 70def save(data, fs, bit, filename): 71 """波形データをWAVEファイルへ出力""" 72 wf = wave.open(filename, "w") 73 wf.setnchannels(1) 74 wf.setsampwidth(bit / 8) 75 wf.setframerate(fs) 76 wf.writeframes(data) 77 wf.close() 78 79if __name__ == '__main__': 80 wf = wave.open("whitenoise.wav", "r") 81 fs = wf.getnframes() 82 83 x = wf.readframes(wf.getnframes()) 84 x = frombuffer(x, dtype="int16") / 32768.0 85 86 # LPFを設計 87 fe = 1000.0 / fs # 正規化したエッジ周波数 88 delta = 100.0 / fs # 正規化した遷移帯域幅 89 b = createLPF(fe, delta) 90 91 # フィルタをかける 92 y = fir(x, b) 93 fft(b, fs) 94 95 # 正規化前のバイナリデータに戻す 96 y = [int(v * 32767.0) for v in y] 97 y = struct.pack("h" * len(y), *y) 98 99 # 音声を保存 100 save(y, fs, 16, "whitenoise_low_pass.wav")

補足情報(FW/ツールのバージョンなど)

pycharmを使っています
初歩的なことかもわからない初心者ですがよろしくおねがいします、、、

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

nを定義するところで、/を使うと結果がfloat型になり、スライスに使うことができません。//演算子で整数(int型)の商が得られますので、こちらを利用してください。

python

1n = len(freqList) // 2

投稿2019/07/19 00:34

編集2019/07/19 00:36
hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sibazyun

2019/07/19 00:46

動きました!!!ありがとうございますm(_ _)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問