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

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

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

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

Q&A

解決済

4回答

671閲覧

Python フーリエ変換

Minochan

総合スコア14

Python 3.x

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

0グッド

0クリップ

投稿2018/06/26 05:40

###Pythonでフーリエ変換をする際に、エラーがでてしまいました

短時間フーリエ変換 を用いたスペクトログラムの作成で音声データを,短い区間でデータ区切り, 各区間に FFT をかけ,パワースペクトルを作成しようとしていました。下記のエラーを解消する方法がわかる方、教えてください。

/usr/local/anaconda3/lib/python3.6/site-packages/scipy/io/wavfile.py:273: WavFileWarning: Chunk (non-data) not understood, skipping it.
WavFileWarning)
Traceback (most recent call last):
File "ans2.py", line 54, in <module>
SpecGram(yl)
File "ans2.py", line 16, in SpecGram
t = np.arange(Nmax) * delta
ValueError: operands could not be broadcast together with shapes (65536,) (2,)

Python

1 2# -*- coding: utf-8 -*- 3 4import numpy as np 5import scipy.fftpack as spf 6from scipy.io.wavfile import read 7import matplotlib.pyplot as plt 8from scipy.fftpack import fft, ifft 9 10 11def SpecGram(x): 12 # 時系列 x のスペクトログラムを表示する関数 13 Fs = x[0] # サンプリングレート 14 delta = 1./Fs # サンプル間隔([sec]) 15 Nmax = 65536 # FFT のため 2 ベキでサンプルをとる 16 fdelta = 1./(Nmax*delta) # 周波数刻み 17 t = np.arange(Nmax) * delta 18 f = np.arange(-Nmax/2, Nmax/2) * fdelta 19 20 L = 1024 // 4 21 X = np.zeros((L, 4), dtype='complex') # スペクトログラムは 周波数としては L までで,区間は8個 22 23 X[:,0] = fft( x[0*L:1*L] ) 24 X[:,1] = fft( x[1*L:2*L] ) 25 X[:,2] = fft( x[2*L:3*L] ) 26 X[:,3] = fft( x[3*L:4*L] ) 27 # とりあえず,plot してみる 28 plt.figure() 29 plt.subplot(2,1,1) 30 plt.plot( t, x ) 31 32 plt.show() 33 34 plt.subplot(2,1,2) 35# plt.imshow( np.log(np.abs(X)) ) # でも良いけどそれなりに表示を適宜合わせる 36# plt.imshow( np.log(np.abs(X[:L/2+1,:])), 37# aspect = 'auto', interpolation='Nearest' ) 38 plt.imshow( np.log(np.abs(X[:L//2+1,:])), 39 extent = (0.0, 1.0, 1./(2*delta), 0.0), 40 aspect = 'auto', interpolation='Nearest' ) 41 42 43# 以下に SpecGram() を用いてスペクトログラムを表示させる 44# スクリプトコードを書く 45 46fname = 'KyokoSampling.wav' 47y = read(fname) 48 49if len(y[1].shape) > 1: # ステレオ音声の場合,左音声を使う 50 yl = y[1][:1024] 51else: 52 yl = y[1] 53 54# スペクトログラム表示 55SpecGram(yl) 56

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

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

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

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

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

guest

回答4

0

ベストアンサー

ご質問にはありませんが、

Python

1Nmax = 65536 # FFT のため 2 ベキでサンプルをとる

これにより、

Python

1plt.plot( t, x )

ここでエラーが出ると思います。

Python

1Nmax = x.shape[0] # FFT のため 2 ベキでサンプルをとる

これで防げると思います。

投稿2018/06/26 06:23

WEjpon

総合スコア88

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

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

0

Python

1y = read(fname) 2 3if len(y[1].shape) > 1: # ステレオ音声の場合,左音声を使う 4 yl = y[1][:1024] 5else: 6 yl = y[1] 7 8# スペクトログラム表示 9SpecGram(yl)

ここが怪しいと思います。
このコードだとy[0]はFs、y[1]はデータになると思いますが、
ylからはFsが消えてますので

def SpecGram(x): Fs = x[0] # サンプリングレート

Fsも取れないです。

修正案として、

Fs, y = read(fname) if len(y.shape[1]) > 1: # ステレオ音声の場合,左音声を使う yl = y[:1024,0] else: yl = y # スペクトログラム表示 SpecGram(yl, Fs)

これでいかがでしょう。

投稿2018/06/26 06:17

WEjpon

総合スコア88

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

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

0

if len(y[1].shape) > 1

if len(y.shape) > 1
では?

python

1if len(y[1].shape) > 1: # ステレオ音声の場合,左音声を使う 2 yl = y[1][:1024, 0] 3else: 4 yl = y[1] 5 6# スペクトログラム表示 7SpecGram((y[0], yl))

これでどうでしょう?

投稿2018/06/26 06:09

編集2018/06/26 10:32
mkgrei

総合スコア8560

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

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

Minochan

2018/06/26 06:16

/usr/local/anaconda3/lib/python3.6/site-packages/scipy/io/wavfile.py:273: WavFileWarning: Chunk (non-data) not understood, skipping it. WavFileWarning) Traceback (most recent call last): File "ans2.py", line 48, in <module> if len(y.shape) > 1: # ステレオ音声の場合,左音声を使う AttributeError: 'tuple' object has no attribute 'shape' このようなエラーが出ました。
guest

0

データについて詳しく見ていないのでわかりかねる部分はありますが、
エラーを読む限り、
65536次元ベクトルと2次元ベクトルの積は計算できませんって言ってると思います。
deltaをブロードキャストして積利用するなら、スカラーで渡した方がいいのかなと思います。

この辺はやりたかった数式によるとおもうので一概には言えないと思いますが

投稿2018/06/26 05:52

hayata-yamamto

総合スコア31

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問