前提・実現したいこと
Pythonで動画から脈拍測定を目的としたシステムを作っています。
その中で、パワースペクトルグラフ化をしたいのですが、実装中に以下のエラーメッセージが発生しました。
初心者で分からないことが多いのですが、よろしくお願い致します。
発生している問題・エラーメッセージ
Traceback (most recent call last): File "HR_Video.py", line 116, in <module> plt.plot(result[1][1:-1], result[0][1:]) File "C:\Users\〇〇\Anaconda3\lib\site-packages\matplotlib\pyplot.py", line 2795, in plot is not None else {}), **kwargs) File "C:\Users\〇〇\Anaconda3\lib\site-packages\matplotlib\axes\_axes.py", line 1666, in plot lines = [*self._get_lines(*args, data=data, **kwargs)] File "C:\Users\〇〇\Anaconda3\lib\site-packages\matplotlib\axes\_base.py", line 225, in __call__ yield from self._plot_args(this, kwargs) File "C:\Users\〇〇\Anaconda3\lib\site-packages\matplotlib\axes\_base.py", line 391, in _plot_args x, y = self._xy_from_xy(x, y) File "C:\Users\〇〇\Anaconda3\lib\site-packages\matplotlib\axes\_base.py", line 270, in _xy_from_xy "have shapes {} and {}".format(x.shape, y.shape)) ValueError: x and y must have same first dimension, but have shapes (448,) and (449,) ```Python
該当のソースコード
#パワースペクトルを求める関数を定義
def signal_fft (data,fs):
n = len(data)-1
y = fftpack.fft(data)/n
y = y[0:round(n/2)]
power = np.abs(y)
# power = 10*np.log10(power)
f = np.arange(0,fs/2,fs/n)
return power , f
######################################################追加部分です
#15sの窓でパワースペクトル算出
time_interval = 15
loop_len = list(range(round(len(img_mean)/(fstime_interval))))
fft_result = []
for n,i in enumerate(loop_len):
if n ==0:
img = img_mean[:time_intervalfs]
fft_result.append(signal_fft(img,fs))
else :
img = img_mean[time_intervalfsn : time_intervalfs(n+1)]
fft_result.append(signal_fft(img,fs))
パワースペクトルグラフ化
#print(fft_result)
time = np.arange(0, len(fft_result[0][0]), 1)
for i, result in enumerate(fft_result):
plt.plot(result[1][1:-1], result[0][1:])
plt.xlabel("Frequency(Hz)",size=12)
plt.ylabel("Power(dB)",size=12)
fig_path = "./Cropped_Output_figs/{0}.png".format(i) #ディレクトリ変更可能
if os.path.isfile(fig_path):
os.remove(fig_path)
plt.savefig(fig_path)
plt.clf()
plt.show()
avg_result = []
N = 5
b = np.ones(N) / N
for i, result in enumerate(fft_result):
avg_result.append([np.convolve(result[0], b, mode="same").tolist(), result[1]])
plt.plot(result[1][1:-1], avg_result[i][0][1:])
plt.xlabel("Frequency(Hz)",size=12)
plt.ylabel("Power(dB)",size=12)
fig_path = "./Cropped_Output_figs/avg_{0}.png".format(i) #ディレクトリ変更可能
if os.path.isfile(fig_path):
os.remove(fig_path)
plt.savefig(fig_path)
plt.clf()
### 試したこと plt.plot(result[1][1:-1], result[0][1:]) の部分が問題だと思ったので、 result[1][1:-1], result[0][1:-1] result[1][1:-1], result[0][1:0] のようにしてみると、何もプロットされない状態でグラフが表示されました。 ### 補足情報(FW/ツールのバージョンなど)
回答1件
あなたの回答
tips
プレビュー