teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

2

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

2019/11/19 08:02

投稿

KeiM
KeiM

スコア8

title CHANGED
@@ -1,1 +1,1 @@
1
- MATLABにおいて、spectrogram関数を用いたスペクトログラムと、自作のコードでプロットしたスペクトログラムが完全一致しない。
1
+ maMATLABにおいて、spectrogram関数を用いたスペクトログラムと、自作のコードでプロットしたスペクトログラムが完全一致しない。
body CHANGED
@@ -11,7 +11,18 @@
11
11
  よろしくお願いいたします。
12
12
 
13
13
  ### ①ビルトインされているspectrogram関数
14
+ ```MATLAB
15
+ [x, fs] = audioread(filename);
16
+ nfft = 128;
17
+ window = rectwin(nfft);
18
+ noverlap = nfft * 0;
19
+ spectrogram(x, window, noverlap, nfft, fs, 'yaxis');
20
+ colormap hot
21
+ ```
14
22
 
23
+ ![イメージ説明](570e92283e209c59200011d08cf59eec.png)
24
+
25
+ ### ②自作コードによるspectrogram
15
26
  ```MATLAB
16
27
  [x, fs] = audioread(filename);
17
28
 

1

コメント追加

2019/11/19 08:02

投稿

KeiM
KeiM

スコア8

title CHANGED
File without changes
body CHANGED
@@ -14,18 +14,7 @@
14
14
 
15
15
  ```MATLAB
16
16
  [x, fs] = audioread(filename);
17
- nfft = 128;
18
- window = rectwin(nfft);
19
- noverlap = nfft * 0;
20
- spectrogram(x, window, noverlap, nfft, fs, 'yaxis');
21
- colormap hot
22
- ```
23
- ![ビルトインされているspectrogram関数](1ce5399a8c9d3707cfc0a2ddbbbfeb71.png)
24
17
 
25
- ### ②自作コードによるspectrogram
26
- ```MATLAB
27
- [x, fs] = audioread(filename);
28
-
29
18
  sample_length = length(x)/fs;
30
19
  nfft = 128;
31
20
  window = rectwin(nfft);
@@ -36,16 +25,29 @@
36
25
 
37
26
  for jj = 1 : J
38
27
  y = x(1 + (jj-1) * nfft : jj * nfft)';
28
+
29
+   % 矩形窓をかけている部分は形式的なものなので特に何もしていません。
30
+ ydft = fft(y) .* rectwin(nfft)';
39
31
 
40
- ydft = fft(y) .* rectwin(nfft)';
32
+ % 絶対値のlogを取っています。
41
33
  YDFT = abs(ydft);
42
34
  YDFT = 10*log10(YDFT);
35
+
36
+ % FFTの出力が、正負の周波数に分布しているので、
37
+ % 正の周波数と0[Hz]成分(0[Hz]~64[Hz])のデータだけ取り出しています。
43
38
  YDFT = YDFT(1:length(ydft)/2+1);
39
+
40
+ % 取り残された負の周波数(-64[Hz]~-1[Hz])のエネルギーを、
41
+ % 取り出した正の周波数に組み入れる為に、2倍しています。
44
42
  YDFT(2:end-1) = 2 * YDFT(2:end-1);
43
+
45
44
  S(:, jj) = YDFT;
46
45
  end
47
46
 
47
+ % スペクトログラムをsurf関数でプロットする為に、周波数軸のグリッドを作っています。
48
48
  F = 0 : (fs/2)/(nfft/2) : fs/2;
49
+
50
+ % スペクトログラムをsurf関数でプロットする為に、時間軸のグリッドを作っています。
49
51
  T = sample_length/J : sample_length/J : sample_length;
50
52
 
51
53
  surf(T, F, S, 'EdgeColor', 'flat', 'FaceColor', 'interp', 'FaceLighting', 'none')