質問編集履歴
2
間違って部分的に削除してしまった部分の修正
title
CHANGED
@@ -1,1 +1,1 @@
|
|
1
|
-
|
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
|
+

|
24
|
+
|
25
|
+
### ②自作コードによるspectrogram
|
15
26
|
```MATLAB
|
16
27
|
[x, fs] = audioread(filename);
|
17
28
|
|
1
コメント追加
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
|
-

|
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
|
-
|
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')
|