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

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

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

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python

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

Q&A

1回答

4266閲覧

音データのローパスフィルタ

cacca

総合スコア5

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python

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

0グッド

0クリップ

投稿2020/02/25 06:07

https://watlab-blog.com/2019/04/30/scipy-lowpass/のページを参考にさせていただき、
音データにローパスフィルタをかけたいと思っています。
同じように2つファイルを作成しましたが、
main_filterを実行したところ、下記のようなエラーが発生しています。
お手数おかけいたしますが、ご教示いただけると助かります。
また、音データにpythonでローパスフィルタをかける方法で他の方法をご存じの方がいらっしゃいましたら
ご助言いただけると幸いです。
よろしくお願いいたします。

main_filter.ipynb↓

from future import print_function
import filter_function
import numpy as np
from matplotlib import pyplot as plt
import os
print(os.getcwd())

samplerate = 48000 #波形のサンプリングレート

ファイル読込

os.chdir(r'C:\file')
data = ('sample.wav')

fp = 1000 #通過域端周波数[Hz]
fs = 945.6 #阻止域端周波数[Hz]
gpass = 0.1 #通過域端最大損失[dB]
gstop = -300 #阻止域端最小損失[dB]

data_filt = filter_function.lowpass(data, samplerate, fp, fs, gpass, gstop)


ModuleNotFoundError Traceback (most recent call last)
<ipython-input-2-a4b4d2e7480a> in <module>()
1 from future import print_function
----> 2 import filter_function
3 import numpy as np
4 from matplotlib import pyplot as plt
5 import os

ModuleNotFoundError: No module named 'filter_function'

filter_function.ipynb↓

import numpy as np
from scipy import signal

#バターワースフィルタ(ローパス)
def lowpass(data, samplerate, fp, fs, gpass, gstop):
fn = samplerate / 2 #ナイキスト周波数
wp = fp / fn #ナイキスト周波数で通過域端周波数を正規化
ws = fs / fn #ナイキスト周波数で阻止域端周波数を正規化
N, Wn = signal.buttord(wp, ws, gpass, gstop) #オーダーとバターワースの正規化周波数を計算
b, a = signal.butter(N, Wn, "low") #フィルタ伝達関数の分子と分母を計算
y = signal.filtfilt(b, a, x) #信号に対してフィルタをかける
return y

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

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

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

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

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

guest

回答1

0

質問者さんが参考にされたページでは、
関数lowpassを定義している自作ファイルfilter_functionがあり、それをmainファイルでimportしています。

質問者さんが挙げられているファイルの拡張子(.ipynb)から、Jupiter Notebookを使用されているかと思いますが、
Jupiter Notebookでそのようにファイルを分けて実装し、importするのをどのようにするのかわかりませんが
(同じディレクトリ内にあればいいのか、そうではないのか試したことがないので)、そこでfilter_functionがmainからみて見つからないところにあることが問題になっています。

そのため、解決策としては以下の2つが挙げられます。

  1. filter_functionというファイルを介さずに関数を定義する。
  2. Jupiter Notebookではなく、spyderなど他の実装環境を使ってみてはいかがでしょうか。spyderの場合は、上で書いたようにfilter_functionファイルがmainファイルと同じフォルダ内に存在すればimportで見つけてくれます。

※もし、上記2つがどちらも前提がダメな場合、つまり、関数とメインのファイルを分けたい&Jupter Notebookで実装したい。ということであれば、申し訳ございませんが、この解決策は使えません。

具体的には、解決策1では、以下のように変更すれば大丈夫です。
data_filt = filter_function.lowpass(data, samplerate, fp, fs, gpass, gstop)のfilter_functionを削除する。
・ローパスフィルタの関数定義の部分( def lowpass(...)return y)をlowpass(data, ...)と呼んでいる部分よりも前に持ってくる。Jupiter Notebookの場合は、ローパスフィルタの関数定義とメイン関数のブロックを分けて、それよりも先に関数定義を実行すれば正常に動作します。

投稿2020/02/25 08:56

Matsui_hero

総合スコア346

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

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

cacca

2020/02/26 01:18

早々にコメントありがとうございます。まずは解決策1を試してみたいと思います。
cacca

2020/02/26 05:20

解決策1を試したところ、IndexErrorが出てしまいました。度々すみませんが、修正すべきところがお分かりになれば、ご教示いただけると助かります。よろしくお願い致します。 from scipy import signal from __future__ import print_function import numpy as np from matplotlib import pyplot as plt import os #バターワースフィルタ(ローパス) def lowpass(x, samplerate, fp, fs, gpass, gstop): fn = samplerate / 2 #ナイキスト周波数 wp = fp / fn #ナイキスト周波数で通過域端周波数を正規化 ws = fs / fn #ナイキスト周波数で阻止域端周波数を正規化 N, Wn = signal.buttord(wp, ws, gpass, gstop) #オーダーとバターワースの正規化周波数を計算 b, a = signal.butter(N, Wn, "low") #フィルタ伝達関数の分子と分母を計算 y = signal.filtfilt(b, a, x) #信号に対してフィルタをかける return y print(os.getcwd()) samplerate = 48000 #波形のサンプリングレート # ファイル読込 os.chdir(r'C:\file') x = np.arange(0, 24000) / samplerate data = ('sample.wav') fp = 1000 #通過域端周波数[Hz] fs = 945.6 #阻止域端周波数[Hz] gpass = 0.1 #通過域端最大損失[dB] gstop = -300 #阻止域端最小損失[dB] data_filt = lowpass(data, samplerate, fp, fs, gpass, gstop) ------------------------------------------------------ IndexError Traceback (most recent call last) <ipython-input-10-e69bcbf44a78> in <module>() 15 16 ---> 17 data_filt = lowpass(data, samplerate, fp, fs, gpass, gstop) <ipython-input-9-e3ad85a3b227> in lowpass(x, samplerate, fp, fs, gpass, gstop) 12 N, Wn = signal.buttord(wp, ws, gpass, gstop) #オーダーとバターワースの正規化周波数を計算 13 b, a = signal.butter(N, Wn, "low") #フィルタ伝達関数の分子と分母を計算 ---> 14 y = signal.filtfilt(b, a, x) #信号に対してフィルタをかける 15 return y #フィルタ後の信号を返す ~\AppData\Local\Continuum\Anaconda3\lib\site-packages\scipy\signal\signaltools.py in filtfilt(b, a, x, axis, padtype, padlen, method, irlen) 3855 # method == "pad" 3856 edge, ext = _validate_pad(padtype, padlen, x, axis, -> 3857 ntaps=max(len(a), len(b))) 3858 3859 # Get the steady state of the filter's step response. ~\AppData\Local\Continuum\Anaconda3\lib\site-packages\scipy\signal\signaltools.py in _validate_pad(padtype, padlen, x, axis, ntaps) 3903 3904 # x's 'axis' dimension must be bigger than edge. -> 3905 if x.shape[axis] <= edge: 3906 raise ValueError("The length of the input vector x must be greater than " 3907 "padlen, which is %d." % edge) IndexError: tuple index out of range
Matsui_hero

2020/02/26 08:40

エラーメッセージに"tuple"って書いているのが気になります。 すみませんが、signal.filtfiltに関しては詳しくわからないので、 以下の情報をいただけますか? y = signal.filtfilt(b, a, x)の直前のtype(b), type(a), type(x), b.shape, a.shape, x.shape ちなみに、質問者さんが最初に参考にされたページで同じことをすると、以下のように出ました。 type(a), type(b), type(x) ともに、<class 'numpy.ndarray'> a.shape, b.shapeは(7,)、 x.shapeは(12800,) ここに差異があると考えられます。
cacca

2020/02/27 01:24

ご親切にありがとうございます。 確認したところ、ご指摘の通り差異がありました。 type(a), type(b)は<class 'numpy.ndarray'> type(x) は<class 'str'> a.shape, b.shapeは(651,) x.shapeは下記エラーとなりました。 AttributeError: 'str' object has no attribute 'shape'
Matsui_hero

2020/02/27 04:32

よくみたら、data = ('sample.wav')となっています。これだと、長さ1のdataはtuple型、要素が'sample.wav'という文字列になります。 おそらくwavファイルのビットデータを読みたいということだと思いますので、修正が必要です。 wavファイルの読み込みですが、普通のバイナリデータ読み込みでもできるかもしれませんし、以下のページで解説されていますので、ご参照ください。 https://qiita.com/futurebone/items/fd42892c237a817cdbb4
cacca

2020/03/02 01:38

ご返信が遅くなり、失礼いたしました。ご助言いただいた方法で修正中です。また状況ご連絡させていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問