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

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

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

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

Q&A

解決済

1回答

1870閲覧

ウェーブレット変換の仕方

hirohiro1999

総合スコア5

Python

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

0グッド

0クリップ

投稿2021/10/21 05:58

前提・実現したいこと

Pythonを使用した音声解析としてウェーブレット変換をしたいです。
一つ目の表示である音声波形はうまく出るのですが、Fs=1/0.0001の行からエラーが出てしまいます。
解決方法を教えていただきたいです。

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

Using memory-mapped arrays... Traceback (most recent call last): File "C:\Users\hiro2\Desktop\sound\wavelet.py", line 45, in <module> r=pycwt.cwt_f(y,freqs,Fs,pycwt.Morlet(omega0)) File "C:\Users\hiro2\AppData\Local\Programs\Python\Python39\lib\site-packages\swan\pycwt.py", line 234, in cwt_f return cwt_a(signal, scales, dt, wavelet, ppd, verbose=verbose) File "C:\Users\hiro2\AppData\Local\Programs\Python\Python39\lib\site-packages\swan\pycwt.py", line 219, in cwt_a W = memsafe_arr((len(scales), siglen), 'complex') File "C:\Users\hiro2\AppData\Local\Programs\Python\Python39\lib\site-packages\swan\pycwt.py", line 34, in memsafe_arr return np.memmap(_tmpfile, dtype=dtype, shape=shape) File "C:\Users\hiro2\AppData\Local\Programs\Python\Python39\lib\site-packages\numpy\core\memmap.py", line 254, in __new__ fid.write(b'\0') File "C:\Users\hiro2\AppData\Local\Programs\Python\Python39\lib\tempfile.py", line 474, in func_wrapper return func(*args, **kwargs) TypeError: write() argument must be str, not bytes

該当のソースコード

Python

1from swan import pycwt 2import numpy as np 3import matplotlib.pyplot as plt 4import wave 5#import struct 6from scipy import fromstring, int16 7#from pylab import * 8#from scipy import signal 9 10 11wavfile = '04-agarikata-kara-01-p6TAskMJUgg.wav' 12wr = wave.open(wavfile, "rb") 13ch = wr.getnchannels() 14width = wr.getsampwidth() 15fr = wr.getframerate() 16fn = wr.getnframes() 17fs = fn / fr 18 19print("オーディオチャンネル数(モノラル: 1 ステレオ:2 ) : ", ch) 20print("オーディオフレーム数 : ", fn) 21print("サンプリングレート : ",fr) 22print("記録時間(Sec) : ", fs, 'sec') 23print("サンプルサイズ(バイト数) : ", width) 24origin = wr.readframes(wr.getnframes()) 25data = origin[:fn] 26wr.close() 27amp = max(data) 28print(amp) 29 30print('len of origin', len(origin)) 31print('len of sampling: ', len(data)) 32 33# ステレオ前提 > monoral 34y = np.frombuffer(data, dtype="int16") /32768.0 35x = np.linspace(0,fs, int(fn/2), endpoint=False) 36plt.plot(x, y) 37plt.show() 38 39print(len(y)) 40 41Fs = 1/0.0001 42omega0 = 5 #0.2 #1 #2 #8 43# (1) Freqを指定してcwt 44freqs=np.arange(10,2000,2.5) 45r=pycwt.cwt_f(y,freqs,Fs,pycwt.Morlet(omega0)) 46rr=np.abs(r) 47 48plt.rcParams['figure.figsize'] = (10, 6) 49fig = plt.figure() 50ax1 = fig.add_axes([0.1, 0.75, 0.7, 0.2]) 51ax2 = fig.add_axes([0.1, 0.1, 0.7, 0.60], sharex=ax1) 52ax3 = fig.add_axes([0.83, 0.1, 0.03, 0.6]) 53 54ax1.plot(x, y, 'k') 55 56img = ax2.imshow(np.flipud(rr), extent=[0, 3,10, 2000], aspect='auto') #, interpolation='nearest') 57twin_ax = ax2 58twin_ax.set_yscale('log') 59twin_ax.set_xlim(0, 3) 60twin_ax.set_ylim(10, 2000) 61ax2.tick_params(which='both', labelleft=False, left=False) 62twin_ax.tick_params(which='both', labelleft=True, left=True, labelright=False) 63fig.colorbar(img, cax=ax3) 64plt.show() 65 66plt.plot(freqs,rr) 67plt.xscale('log') 68plt.show()

試したこと

他のサイトを訪れた結果コードがステレオではなくモノラル対応なのではないかという疑惑があります。

使用したサイト(FW/ツールのバージョンなど)

https://qiita.com/MuAuan/items/858aab2879708668e2bb

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

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

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

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

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

jbpb0

2021/11/08 08:59 編集

r=pycwt.cwt_f(y,freqs,Fs,pycwt.Morlet(omega0)) の「y」を「y[:100000]」に変えてサイズを小さくしたら実行できましたが、「y[:200000]」ではダメでした
jbpb0

2021/11/01 09:01

上記のようにサイズを減らしても、ダメでしたでしょうか?
hirohiro1999

2021/11/08 06:46

出来なかったです。。。
jbpb0

2021/11/08 09:01

当方で実行できたコードを回答に追記したので、それで確認してみてください
hirohiro1999

2021/11/09 06:25

ありがとうございます!
guest

回答1

0

ベストアンサー

当方のWin 10のPythonで、適当なWavファイルを使って実行してみたところ、データのサイズが大きくなるとダメでした

python

1r=pycwt.cwt_f(y,freqs,Fs,pycwt.Morlet(omega0))

の「y」を「y[:100000]」に変えてサイズを小さくしたら実行できましたが、「y[:200000]」ではダメで質問に掲載のと同じエラーが出ました

サイズをいくつまで減らしたら大丈夫なのかは、環境に依存するかもしれないので、質問者さんの環境でも確認してみてください

【追記】
フリーWave,MP3
の「Type:ショートフレーズ、Image:ファンファーレ(トランペット)」の「fanfare.wav」をダウンロードして、下記のコードで当方のWin 10パソコンで確認したところ、質問に掲載のエラーが出ずに実行できました

python

1from swan import pycwt 2import numpy as np 3import matplotlib.pyplot as plt 4import wave 5#import struct 6from scipy import fromstring, int16 7#from pylab import * 8#from scipy import signal 9 10 11wavfile = 'fanfare.wav' 12wr = wave.open(wavfile, "rb") 13ch = wr.getnchannels() 14width = wr.getsampwidth() 15fr = wr.getframerate() 16fn = wr.getnframes() 17fs = fn / fr 18 19print("オーディオチャンネル数(モノラル: 1 ステレオ:2 ) : ", ch) 20print("オーディオフレーム数 : ", fn) 21print("サンプリングレート : ",fr) 22print("記録時間(Sec) : ", fs, 'sec') 23print("サンプルサイズ(バイト数) : ", width) 24origin = wr.readframes(wr.getnframes()) 25data = origin[:fn] 26wr.close() 27amp = max(data) 28print(amp) 29 30print('len of origin', len(origin)) 31print('len of sampling: ', len(data)) 32 33# ステレオ前提 > monoral 34y = np.frombuffer(data, dtype="int16") /32768.0 35x = np.linspace(0,fs, int(fn/2), endpoint=False) 36plt.plot(x, y) 37plt.show() 38 39print(len(y)) 40 41Fs = 1/0.0001 42omega0 = 5 #0.2 #1 #2 #8 43# (1) Freqを指定してcwt 44freqs=np.arange(10,2000,2.5) 45r=pycwt.cwt_f(y[:100000],freqs,Fs,pycwt.Morlet(omega0)) 46rr=np.abs(r) 47 48plt.rcParams['figure.figsize'] = (10, 6) 49fig = plt.figure() 50ax1 = fig.add_axes([0.1, 0.75, 0.7, 0.2]) 51ax2 = fig.add_axes([0.1, 0.1, 0.7, 0.60], sharex=ax1) 52ax3 = fig.add_axes([0.83, 0.1, 0.03, 0.6]) 53 54ax1.plot(x, y, 'k') 55 56img = ax2.imshow(np.flipud(rr), extent=[0, 3,10, 2000], aspect='auto') #, interpolation='nearest') 57twin_ax = ax2 58twin_ax.set_yscale('log') 59twin_ax.set_xlim(0, 3) 60twin_ax.set_ylim(10, 2000) 61ax2.tick_params(which='both', labelleft=False, left=False) 62twin_ax.tick_params(which='both', labelleft=True, left=True, labelright=False) 63fig.colorbar(img, cax=ax3) 64plt.show() 65 66plt.plot(freqs,rr) 67plt.xscale('log') 68plt.show()

投稿2021/10/23 02:13

編集2021/11/08 08:55
jbpb0

総合スコア7651

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問