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

조회 수: 21 (최근 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일
斎藤様いつもコメントありがとうございます.
承知いたしました.
先生に聞いたところロードノイズに定数をかけるのではなく,ガラガラ音を小さくしていくことで相対的にロードノイズを大きくできないかと言われましたのでそちらでも検討したいと考えております.

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 MATLAB 入門에 대해 자세히 알아보기

제품

Community Treasure Hunt

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

Start Hunting!