質問編集履歴

2

間違って部分的に削除してしまった部分の修正

2019/11/19 08:02

投稿

KeiM
KeiM

スコア8

test CHANGED
@@ -1 +1 @@
1
- MATLABにおいて、spectrogram関数を用いたスペクトログラムと、自作のコードでプロットしたスペクトログラムが完全一致しない。
1
+ maMATLABにおいて、spectrogram関数を用いたスペクトログラムと、自作のコードでプロットしたスペクトログラムが完全一致しない。
test CHANGED
@@ -24,7 +24,29 @@
24
24
 
25
25
  ### ①ビルトインされているspectrogram関数
26
26
 
27
+ ```MATLAB
27
28
 
29
+ [x, fs] = audioread(filename);
30
+
31
+ nfft = 128;
32
+
33
+ window = rectwin(nfft);
34
+
35
+ noverlap = nfft * 0;
36
+
37
+ spectrogram(x, window, noverlap, nfft, fs, 'yaxis');
38
+
39
+ colormap hot
40
+
41
+ ```
42
+
43
+
44
+
45
+ ![イメージ説明](570e92283e209c59200011d08cf59eec.png)
46
+
47
+
48
+
49
+ ### ②自作コードによるspectrogram
28
50
 
29
51
  ```MATLAB
30
52
 

1

コメント追加

2019/11/19 08:02

投稿

KeiM
KeiM

スコア8

test CHANGED
File without changes
test CHANGED
@@ -30,28 +30,6 @@
30
30
 
31
31
  [x, fs] = audioread(filename);
32
32
 
33
- nfft = 128;
34
-
35
- window = rectwin(nfft);
36
-
37
- noverlap = nfft * 0;
38
-
39
- spectrogram(x, window, noverlap, nfft, fs, 'yaxis');
40
-
41
- colormap hot
42
-
43
- ```
44
-
45
- ![ビルトインされているspectrogram関数](1ce5399a8c9d3707cfc0a2ddbbbfeb71.png)
46
-
47
-
48
-
49
- ### ②自作コードによるspectrogram
50
-
51
- ```MATLAB
52
-
53
- [x, fs] = audioread(filename);
54
-
55
33
 
56
34
 
57
35
  sample_length = length(x)/fs;
@@ -74,17 +52,37 @@
74
52
 
75
53
  y = x(1 + (jj-1) * nfft : jj * nfft)';
76
54
 
55
+
56
+
57
+   % 矩形窓をかけている部分は形式的なものなので特に何もしていません。
58
+
59
+ ydft = fft(y) .* rectwin(nfft)';
60
+
77
61
 
78
62
 
79
- ydft = fft(y) .* rectwin(nfft)';
63
+ % 絶対値のlogを取っています。
80
64
 
81
65
  YDFT = abs(ydft);
82
66
 
83
67
  YDFT = 10*log10(YDFT);
84
68
 
69
+
70
+
71
+ % FFTの出力が、正負の周波数に分布しているので、
72
+
73
+ % 正の周波数と0[Hz]成分(0[Hz]~64[Hz])のデータだけ取り出しています。
74
+
85
75
  YDFT = YDFT(1:length(ydft)/2+1);
86
76
 
77
+
78
+
79
+ % 取り残された負の周波数(-64[Hz]~-1[Hz])のエネルギーを、
80
+
81
+ % 取り出した正の周波数に組み入れる為に、2倍しています。
82
+
87
83
  YDFT(2:end-1) = 2 * YDFT(2:end-1);
84
+
85
+
88
86
 
89
87
  S(:, jj) = YDFT;
90
88
 
@@ -92,7 +90,13 @@
92
90
 
93
91
 
94
92
 
93
+ % スペクトログラムをsurf関数でプロットする為に、周波数軸のグリッドを作っています。
94
+
95
95
  F = 0 : (fs/2)/(nfft/2) : fs/2;
96
+
97
+
98
+
99
+ % スペクトログラムをsurf関数でプロットする為に、時間軸のグリッドを作っています。
96
100
 
97
101
  T = sample_length/J : sample_length/J : sample_length;
98
102