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

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

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

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python 3.x

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2296閲覧

【Python】初心者、フーリエ変換、IndexError: list index out of rangeの解決法

Kenza

総合スコア21

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python 3.x

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/10/13 09:52

編集2019/10/13 09:54

ステレオのwavファイルに対し、フーリエ変換を行いたいので、以下のサイトを参考にし、実行しました。
参考コード

IndexError: list index out of rangeというエラーが吐き出されました。

原因につきまして、存在しない要素にアクセスしようとしている、ということはわかったのですが、

具体的にどこの箇所が原因源に該当するのか、どこを直せばいいのかなど不明ですので、よろしくお願いします。

また、実行に使用した音源は以下です。
使用ステレオ音源

python

1import wave 2import struct 3from scipy import fromstring, int16 4import numpy as np 5from pylab import * 6%matplotlib inline 7 8wavfile = 'ASMR_grain/bonfire_out.wav' 9wr = wave.open(wavfile, "rb") 10ch = wr.getnchannels() 11width = wr.getsampwidth() 12fr = wr.getframerate() 13fn = wr.getnframes() 14 15N = 64 16span = 4 17 18print('チャンネル', ch) 19print('総フレーム数', fn) 20print('サンプル時間', 1.0 * N * span / fr, '秒') 21 22origin = wr.readframes(wr.getnframes()) 23data = origin[:N * span * ch * width] 24wr.close() 25 26print('現配列長', len(origin)) 27print('サンプル配列長: ', len(data))

チャンネル 2
総フレーム数 1434
サンプル時間 0.005804988662131519 秒
現配列長 5736
サンプル配列長: 1024

python

1# ステレオ前提 2X = np.frombuffer(data, dtype="int16") 3left = X[::2] 4right = X[1::2]

python

1def fourier (x, n, w): 2 K = [] 3 for i in range(0, w-2): 4 sample = x[i * n:( i + 1) * n] 5 partial = np.fft.fft(sample) 6 K.append(partial) 7 8 return K 9 10def inverse_fourier (k): 11 ret = [] 12 for sample in k: 13 inv = np.fft.ifft(sample) 14 ret.extend(inv.real) 15 16 print (len(sample)) 17 return ret

python

1Kl = fourier(left, N, span) 2Kr = fourier(right, N, span) 3freqlist = np.fft.fftfreq(N, d=1/fr) 4amp = [np.sqrt(c.real ** 2 + c.imag ** 2) for c in Kl[2500]] 5plot(freqlist, amp, marker= 'o', linestyle='-') 6axis([0, fr / 2 , 0, 100000]) 7 8amp = [np.sqrt(c.real ** 2 + c.imag ** 2) for c in Kr[2500]] 9plot(freqlist, amp, marker= 'o', linestyle='-')

エラー

IndexError Traceback (most recent call last)
<ipython-input-33-ee594416e8d3> in <module>
2 Kr = fourier(right, N, span)
3 freqlist = np.fft.fftfreq(N, d=1/fr)
----> 4 amp = [np.sqrt(c.real ** 2 + c.imag ** 2) for c in Kl[2]]
5 plot(freqlist, amp, marker= 'o', linestyle='-')
6 axis([0, fr / 2 , 0, 10])

IndexError: list index out of range

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

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

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

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

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

coco_bauer

2019/10/13 10:07

「amp = [np.sqrt(c.real ** 2 + c.imag ** 2) for c in Kl[2500]]」の行で、 「----> 4 amp = [np.sqrt(c.real 2 + c.imag 2) for c in Kl[2]]」というエラーが出ているように見えるのですが、"c.real ** 2 "が”c.real 2 ”に書き換わってたりして意味不明です。 本当に質問に書かれているPythonのコードを実行した際にでたエラーなのですか???
Kenza

2019/10/13 10:13

すいません、表記ミスです Kl = fourier(left, N, span) Kr = fourier(right, N, span) freqlist = np.fft.fftfreq(N, d=1/fr) amp = [np.sqrt(c.real ** 2 + c.imag ** 2) for c in Kl[2]] plot(freqlist, amp, marker= 'o', linestyle='-') axis([0, fr / 2 , 0, 100000]) amp = [np.sqrt(c.real ** 2 + c.imag ** 2) for c in Kr[2]] plot(freqlist, amp, marker= 'o', linestyle='-') が実際に実行したコードです
guest

回答1

0

ベストアンサー

Python

1amp = [np.sqrt(c.real ** 2 + c.imag ** 2) for c in Kl[2]]

こちらの行で、Kl[2]は存在しません。KlとKrの長さはそれあぞれ2なので、参照できるインデックスは0か1です(つまりエラーにならないのはKl[0]かKl[1]などと書いた場合のみ)
試しにこちらを

Python

1amp = [np.sqrt(c.real ** 2 + c.imag ** 2) for c in Kl[1]]

Python

1amp = [np.sqrt(c.real ** 2 + c.imag ** 2) for c in Kr[2]]

と書き換えたところ、動きました。作者さんの意図と合致するかは別問題ですが、、

投稿2019/10/14 01:40

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Kenza

2019/10/14 04:41

ありがとうございます。解決しました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問