MATLAB Answers

"ファイルの書き込み​に際しデータが切り捨​てられました"と表示​される

76 ビュー (過去 30 日間)
Kaede
Kaede 2020 年 8 月 12 日
コメント済み: Kaede 2020 年 8 月 12 日
clear;
[p1,fs]=audioread('40kph_RN.wav');
[p2,fs]=audioread('2000rpm_Knock.wav');
fs=44100;
p2(448512,[1 2]) = [0,0];
%smix=30*p1+p2;
%soundsc(smix,fs)
%filename='mix.wav';
%audiowrite(filename,smix,fs);
Lch_p1=p1(:,1);
Rch_p1=p1(:,2);
Lch_p2=p2(:,1);
Rch_p2=p2(:,2);
smix_Lch=22*Lch_p1+Lch_p2;
%soundsc(smix_Lch,fs)
filename='mix_Lch.wav';
audiowrite(filename,smix_Lch,fs);
smix_Rch=22*Rch_p1+Rch_p2;
%soundsc(smix_Rch,fs)
filename='mix_Rch.wav';
audiowrite(filename,smix_Rch,fs);
fft_p1L=fft(22*Lch_p1);
dB_p1L=mag2db(abs(fft_p1L));
fft_p1R=fft(22*Rch_p1);
dB_p1R=mag2db(abs(fft_p1R));
fft_p2L=fft(Lch_p2);
dB_p2L=mag2db(abs(fft_p2L));
fft_p2R=fft(Rch_p2);
dB_p2R=mag2db(abs(fft_p2R));
f = (0:length(fft_p1L)-1)*fs/length(fft_p1L);
figure(1)
semilogx(f,dB_p2L)
xlim([0 fs/2])
ylim([-100,100])
xlabel('frequency[Hz]')
ylabel('Magnitude[dB]')
hold on
semilogx(f,dB_p1L)
grid on, hold off
legend('2000rpm.knock','roadnoise');
figure(2)
semilogx(f,dB_p2R)
xlim([0 fs/2])
ylim([-100,100])
xlabel('frequency[Hz]')
ylabel('Magnitude[dB]')
hold on
semilogx(f,dB_p1R)
grid on, hold off
legend('2000rpm.knock','roadnoise');
このようなプログラムを使用してディーゼルエンジンのガラガラといった音に走行騒音を重ねることでガラガラ音を聞こえにくくするという実験を行っています.そのためにLch_p1,Rch_p1に定数をかけます.1kあたりがガラガラ音になるのでこれを消そうとすると100ぐらいかける必要がありますが,"ファイルの書き込みに際しデータが切り捨てられました"と表示され,音が汚く音割れのような現象が起きます.これを防ぐ方法はありますでしょうか.

  1 件のコメント

Kaede
Kaede 2020 年 8 月 12 日
追加で質問なのですがデータが切り捨てられているということはこの作成した音は原音に忠実に作成されていないということでしょうか.

サインインしてコメントする。

回答 (1 件)

Kojiro Saito
Kojiro Saito 2020 年 8 月 12 日
こちらのドキュメントのとおり、audiowriteの書き込み対象のデータ型によって、書き込めるデータの範囲が変わってきます。上記の変数smix_Lchsmix_Rchのデータ型を確認してみてください。
whos smix_Lch
whos smix_Rch
このコマンドのクラスにデータ型が返ってきます。
もしデータ型がuint8の場合は0以上255以下、singleやdoubleの場合は、-1.0以上+1.0以下が書き込めるデータの範囲となります。これ以外の範囲になっていると、データが切り捨てられてしまうので、原音が忠実に作成されていないことになります。
audiowriteをやる前にデータを正規化して範囲に収まるようにしてみてください。
例えば、
smix_Lch = smix_Lch / max(smix_Lch);
audiowrite(filename,smix_Lch,fs);
とか、もしsmix_Lchがマイナスの値を取るなら
smix_Lch = smix_Lch / max(abs(smix_Lch));
audiowrite(filename,smix_Lch,fs);
とかでいかがでしょうか。

  1 件のコメント

Kaede
Kaede 2020 年 8 月 12 日
斎藤様いつもコメントありがとうございます.
承知いたしました.
先生に聞いたところロードノイズに定数をかけるのではなく,ガラガラ音を小さくしていくことで相対的にロードノイズを大きくできないかと言われましたのでそちらでも検討したいと考えております.

サインインしてコメントする。

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!